Reputation: 79
Before i asked my question, I read the previous posts.When I run the script, it shows Invalid rank specifier:expected ',' or ']'
error at following code. BTW, I tried with new float[8939, 100];
but it still shows the error.
And also how can use hashtable to save the result where i wrote the hashtable comments.
namespace function
{
public partial class Form1 : Form
{
float userscore,itemscore,result;
string lineitem, lineuser;
float[][] a = new float[89395][100]; //<----the error is here
float[][] b = new float[1143600][100]; //<----the error is here
//float[,] c = new float[89395, 100];
StreamReader fileitem = new StreamReader("c:\\1.txt");
StreamReader fileuser = new StreamReader("c:\\2.txt");
public Form1()
{
InitializeComponent();
for (int x = 0; x <= 8939500; x++)
{
lineuser = fileuser.ReadLine();
string[] values = lineuser.Split(' ');
int userid, factoriduser;
foreach (string value in values)
{
userid = Convert.ToInt32(values[0]);
factoriduser = Convert.ToInt32(values[1]);
userscore = Convert.ToSingle(values[2]);
a[userid][factoriduser] = userscore;
}
}
for (int y = 0; y <= 114360000; y++)
{
lineitem = fileitem.ReadLine();
string[] valuesi = lineitem.Split(' ');
int itemid, factoriditem;
foreach (string value in valuesi)
{
itemid = Convert.ToInt32(valuesi[0]);
factoriditem = Convert.ToInt32(valuesi[1]);
itemscore = Convert.ToSingle(valuesi[2]);
b[itemid][factoriditem] = itemscore;
}
}
}
public float dotproduct(int userid,int itemid)
{
//get the score of 100 from user and item to dotproduct
float[] u_f = a[userid];
float[] i_f = b[itemid];
for (int i = 0; i <u_f.GetLength(1); i++)
{
result += u_f[userid] * i_f[itemid];
}
return result;
}
private void btn_recomm_Click(object sender, EventArgs e)
{
if(txtbx_id.Text==null)
{
MessageBox.Show("please insert user id");
}
if (txtbx_id.Text != null)
{
int sc = Convert.ToInt32(txtbx_id.Text);
if (sc>=0 &&sc<=89395)
{
for (int z=0;z<=1143600;z++)
{
dotproduct(sc,z);
}
//Hashtable hashtable = new Hashtable();
//put the result in hashtable
//foreach (DictionaryEntry entry in hashtable)
//{
//Console.WriteLine("{0}, {1}", entry.Key, entry.Value);
// }
}
}
if (txtbx_id==null &&txtbx_itemid==null)
{
int uid = Convert.ToInt32(txtbx_id.Text);
int iid = Convert.ToInt32(txtbx_itemid.Text);
{
if (uid>=0 && uid<=89395 && iid>=0 && iid<=1143600)
{
dotproduct(uid,iid);
MessageBox.Show("The Score of user id "+uid+" is "+result);
}
}
}
}
Upvotes: 1
Views: 1991
Reputation: 726929
You cannot make a new 2D array like that - you do it one dimension at a time. You can useva loop to initialize the second dimensiuon, or use LINQ:
float[][] a = Enumerable.Range(0, 89395).Select(i=>new float[100]).ToArray();
Upvotes: 1
Reputation: 366
float[,] a = new float[89395,100];
float[,] b = new float[1143600,100];
Reference: http://msdn.microsoft.com/en-us/library/2yd9wwz4.aspx
Upvotes: 3
Reputation: 125650
You cannot declare jagged array like that. You have to declare outer array first, and then declare all inner arrays:
float[][] a = new float[89395][];
for(int i = 0; i < 89395; i++)
a[i] = new float[100];
or you should change your array to multidimensional float[,]
array:
float[,] a = new float[89395,100];
Upvotes: 4