|
I recommend you create a List of lists to make a 2D matrix. You can use the Random class to generate random numbers for you. That should be enough info to get you started. To fill in simple details (like how to use a for loop), I recommend you read a book on C#. Good luck.
|
|
|
|
|
I agree on the book.
As far as the matrix goes, this is an instance where I'd prefer an actual 2D array, as it is going to be used for inversion, LU decomposition, or whatever method known to mankind in order to solve a system of linear equations. Sparse matrices may benefit from a different structure, but that is not part of programming 101.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that. All Toronto weekends should be extremely wet until we get it automated in regular forums, not just QA.
modified on Tuesday, February 23, 2010 10:36 PM
|
|
|
|
|
its good to study programming logic but you have to start with some basic programming and then to advace..
matrix operations very handy with C#
you can refer following code for generating matrix 10 X 10 order,
public static void Generate()
{
//Declaring Array
int [,]Arry=new int[10,10];
//Random Class
Random random = new Random();
string str = string.Empty;
//Loop ith element
for (int i=0; i<10; i++)
{
//loop jth element
for (int j = 0; j < 10; j++)
{
//get random number between 1 and 1000
Arry[i, j] = random.Next(1, 1000);
//printing elements a00,a01,a02....
Console.Write(Arry[i, j].ToString()+" ");
}
Console.WriteLine();
}
Console.Read();
}
Read books and tutorials.. and general programming concepts then you can be a king!!
|
|
|
|
|
Thanks that is a great help
|
|
|
|
|
What would be the code to display the matrix in an excel file?
This is totally cool. I am ready Headfirst C# now any other beginning programming books recommended?
Iman
|
|
|
|
|
Iman Mohtashemi wrote: What would be the code to display the matrix in an excel file?
That is a new question. If you need to ask a new question, as it as a new question rather than a reply in the thread for the existing question.
Iman Mohtashemi wrote: any other beginning programming books recommended?
Figure out which areas you'd like to read about, then get a book on it. Since you asked about Excel, perhaps you'd be interested in Microsoft .NET Development for Microsoft Office or one like it.
|
|
|
|
|
I’m trying to get a Microsoft.Office.Interop.Excel.Application refrence from a Process that identifies a running Excel.exe
This is where I am…
System.Diagnostics.Process[] apps = System.Diagnostics.Process.GetProcessesByName("EXCEL");
foreach (System.Diagnostics.Process p in apps)
{
Microsoft.Office.Interop.Excel.Application thisApp = ?????????????;
}
I haven’t been able to find any answers to this question (but have found a few others that asked it). Any ideas?
Thank you for your time,
Matt
|
|
|
|
|
|
I have the following code that converts a lower case alphabetical character (a-z) to upper-case (A-Z):
if (letter >= 97 && letter <= 122)
{
ascii -= 32;
letter = (char)ascii;
}
The problem is I think the cast for "letter" is affecting the performance as I am looping through a text of around 5 million characters.
Someone suggested a "lookup table" but I do not know what it is , possibly a Dictionary type?
Can anyone offer some advise for this problem?
Thanks!
|
|
|
|
|
Why not just use ToUpper ? I know the language. I've read a book. - _Madmatt
|
|
|
|
|
.ToString().ToChar() could takes up allot of performance?
Thanks anyway :P
|
|
|
|
|
I didn't say to use ToString.
Char.ToUpper[^] I know the language. I've read a book. - _Madmatt
|
|
|
|
|
System.Char.ToUpper(x)
Can't really get any faster than that. No need to convert to string first.
Hope this helps
|
|
|
|
|
Ok I will use that, beats the casting anyway :P
|
|
|
|
|
thebuzzwright wrote: Someone suggested a "lookup table" but I do not know what it is , possibly a Dictionary type?
An array of chars, indexed by the char you want to uppercase
Also, I thought that comparisons on chars were perfectly valid?
The cast for letter shouldn't matter that much. But why are "ascii" and "letter" not the same variable?
|
|
|
|
|
Ah thanks for the description of a lookup table
I have changed the code to:
if (_letter < 65 || _letter > 122) continue;
if (_letter >= 97 && _letter <= 122)
{
_letter = char.ToUpper(_letter);
}
Performance wise its slightly better as expected, I didn't know char had a "ToUpper()"
Thanks for the help
|
|
|
|
|
You don't need the if s at all; ToUpper performs them itself so you're performing them twice -- and thereby hurting performance.
"The uppercase equivalent of c, or the unchanged value of c, if c is already uppercase or not alphabetic."
|
|
|
|
|
Snap! You should never use standby on an elephant. It always crashes when you lift the ears. - Mark Wallace
C/C++ (I dont see a huge difference between them, and the 'benefits' of C++ are questionable, who needs inheritance when you have copy and paste) - fat_boy
|
|
|
|
|
Performance wise, it may be worth taking out the tests to see if you need to do the conversion - it may well be that the .NET ToUpper is more efficient than yours, and since it will be done anyway whenever ToUpper is executed, you may find it quicker without testing - particularly if you are looking at normal text where nearly all characters are lower case to start with. You should never use standby on an elephant. It always crashes when you lift the ears. - Mark Wallace
C/C++ (I dont see a huge difference between them, and the 'benefits' of C++ are questionable, who needs inheritance when you have copy and paste) - fat_boy
|
|
|
|
|
The code shown translates to a few instructions only, so it takes a fraction of a microsecond to execute; if your text handling seems slow, look at the larger picture (and explain and show us more). Unless you need complex calculations and decisions, file input/output is likely to dominate the performance.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that. All Toronto weekends should be extremely wet until we get it automated in regular forums, not just QA.
|
|
|
|
|
I have decided to post the full source of the code so far, the code is a bit messy but I felt I had to break some coding standards to achieve higher performance so here it goes:
using System;
using System.Text;
using System.IO;
namespace CharacterReader
{
unsafe class Program
{
static readonly char[] Letter = new char[26];
static string _fileName = "lol.txt";
[STAThread]
static void Main()
{
using (System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog())
{
if (open.ShowDialog().Equals(System.Windows.Forms.DialogResult.OK))
{
_fileName = open.FileName;
}
}
uint *value = stackalloc uint[26];
Load();
Console.WriteLine("Reading File...");
ReadFile(_fileName);
Console.WriteLine("Analysing file...");
AnalyseFile(value);
Console.WriteLine("Done!");
GetTotal(value);
Console.ReadKey();
}
static int _index;
static int _i;
static void Load()
{
for (_i = 65; _i < 91; _i++)
{
Letter[_index] = (char)_i;
_index++;
}
_index = 0;
}
const int BufferSize = 512;
static readonly StringBuilder Contents = new StringBuilder(99999);
static private void ReadFile(string filename)
{
FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
StreamReader streamReader = new StreamReader(fileStream);
char[] fileContents = new char[BufferSize];
int* ptr = stackalloc int[1];
*ptr = streamReader.Read(fileContents, 0, BufferSize);
while (*ptr > 0)
{
Contents.Append(fileContents);
*ptr = streamReader.Read(fileContents, 0, BufferSize);
}
streamReader.Close();
fileStream.Close();
}
static void AnalyseFile(uint* value)
{
char* charPtr = stackalloc char[1];
for (_i = 0; _i < Contents.Length; _i++)
{
for (int k = 0; k < Letter.Length; k++)
{
*charPtr = Contents[_i];
if (*charPtr < 65 ) continue;
if (*charPtr >= 97 && *charPtr <= 122)
{
*charPtr = char.ToUpper(*charPtr);
}
if (!(*charPtr).Equals(Letter[k])) continue;
(value[k]) += 1;
break;
}
}
}
static void GetTotal(uint* value)
{
uint* biggestValue = stackalloc uint[1];
for (_i = 0; _i < 26; _i++)
{
if (*biggestValue >= value[_i]) continue;
*biggestValue = value[_i];
}
for (_i = 0; _i < 26; _i++)
{
if (!(*biggestValue).Equals(value[_i])) continue;
_index = _i;
break;
}
Console.WriteLine("The most common char is {0} with {1} hits", Letter[_index], *biggestValue);
}
}
}
Has anyone got some tips to make it run faster, it seems the "AnalyseFile" method seems to be slower than the file input
|
|
|
|
|
That looks horribly inefficient. Please replace CODE tags by PRE tags (so it gets formatted properly), then I will look into it.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that. All Toronto weekends should be extremely wet until we get it automated in regular forums, not just QA.
|
|
|
|
|
Thanks :P
Here is an updated version of the code, it runs very fast which is suprising, the small project was actually quite a good learning experiance for me (being a student), one of the things I learnt was that higher performance in code seems to be achieved by decrementing coding standards
using System;
using System.Text;
using System.IO;
using System.Diagnostics;
namespace CharacterReader
{
unsafe class Program
{
static readonly char[] Letter = new char[26];
static string _fileName = "lol.txt";
[STAThread]
static void Main()
{
using (System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog())
{
if (open.ShowDialog().Equals(System.Windows.Forms.DialogResult.OK))
{
_fileName = open.FileName;
}
}
Stopwatch stopWatch = new Stopwatch();
uint* value = stackalloc uint[26];
Load();
Console.WriteLine("Reading File...");
stopWatch.Start();
ReadFile(_fileName);
Console.WriteLine("Analysing file...");
AnalyseFile(value);
Console.WriteLine("Done!");
GetTotal(value);
stopWatch.Stop();
Console.WriteLine(stopWatch.Elapsed.TotalMilliseconds);
Console.ReadKey();
}
static int _index;
static int _i;
static void Load()
{
for (_i = 97; _i < 123; _i++)
{
Letter[_index] = (char)_i;
_index++;
}
_index = 0;
}
const int BufferSize = 512;
static readonly StringBuilder Contents = new StringBuilder(99999);
static private void ReadFile(string filename)
{
FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
StreamReader streamReader = new StreamReader(fileStream);
char[] fileContents = new char[BufferSize];
int* ptr = stackalloc int[1];
*ptr = streamReader.Read(fileContents, 0, BufferSize);
while (*ptr > 0)
{
Contents.Append(fileContents);
*ptr = streamReader.Read(fileContents, 0, BufferSize);
}
streamReader.Close();
fileStream.Close();
}
static void AnalyseFile(uint* value)
{
char* charPtr = stackalloc char[1];
for (_i = 0; _i < Contents.Length; _i++)
{
*charPtr = Contents[_i];
if ((*charPtr < 65) || (*charPtr > 90 && *charPtr < 97) || (*charPtr > 122)) continue;
*charPtr = char.ToLower(*charPtr);
value[*charPtr - 97] +=1;
}
}
static void GetTotal(uint* value)
{
uint* biggestValue = stackalloc uint[1];
for (_i = 0; _i < 26; _i++)
{
if (*biggestValue >= value[_i]) continue;
*biggestValue = value[_i];
}
for (_i = 0; _i < 26; _i++)
{
if (!(*biggestValue).Equals(value[_i])) continue;
_index = _i;
break;
}
Console.WriteLine("The most common char is {0} with {1} hits", Letter[_index], *biggestValue);
}
}
}
Thanks for your help :P
|
|
|
|
|
OK, PRE tags have turned that into a readable code snippet.
I see you got rid of the nested for loops; there was indeed no reason to have two nested loops.
Why are you still using that char pointer?
I would give the technique below a try:
static void AnalyseFile(uint* value) {
foreach(char c in Contents) value[(int)c]++;
foreach(char uc in "ABCDEFGHIJKLMNOPQRSTUVWXYZ") {
value[(int)uc.ToLower()]+=value[(int)uc];
}
comments:
1. performance optimization like these may be relevant only for large amounts of data
2. it has a different use of the value array
3. it will fail for non-ANSI text (when character values exceed 255).
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read code that is properly formatted, adding PRE tags is the easiest way to obtain that. All Toronto weekends should be extremely wet until we get it automated in regular forums, not just QA.
|
|
|
|
|
Ok everyone thanks for your help it was very helpful
Here is the final version of the code and I feel I have beaten it to death:
using System;
using System.Text;
using System.IO;
namespace CharacterReader
{
unsafe class Program
{
static readonly byte[] Letter = new byte[26];
static string _fileName;
[STAThread]
static void Main()
{
using (System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog())
{
if (open.ShowDialog().Equals(System.Windows.Forms.DialogResult.OK))
{
_fileName = open.FileName;
}
}
uint* value = stackalloc uint[26];
Load();
Console.WriteLine("Reading File...");
ReadFile( _fileName);
Console.WriteLine("Analysing file...");
AnalyseFile(ref value);
Console.WriteLine("Done!");
GetTotal(ref value);
Console.ReadKey();
}
static int _index;
static int _i;
static void Load()
{
for (byte i = 97; i < 123; i++)
{
Letter[_index] = i;
_index++;
}
_index = 0;
}
const int BufferSize = 512;
static readonly StringBuilder Contents = new StringBuilder(99999);
static private void ReadFile(string filename)
{
FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
StreamReader streamReader = new StreamReader(fileStream);
char[] fileContents = new char[BufferSize];
int* ptr = stackalloc int[1];
*ptr = streamReader.Read(fileContents, 0, BufferSize);
while (*ptr > 0)
{
Contents.Append(fileContents);
*ptr = streamReader.Read(fileContents, 0, BufferSize);
}
streamReader.Close();
fileStream.Close();
}
static void AnalyseFile(ref uint* value)
{
byte charPtr;
for (_i = 0; _i < Contents.Length; _i++)
{
charPtr = (byte)Contents[_i];
if (charPtr < 65) continue;
if (charPtr > 122) continue;
if (charPtr > 90 && charPtr < 97) continue;
if (charPtr < 97)
{
value[charPtr - 65] += 1;
}
else
{
value[charPtr - 97] += 1;
}
}
}
static void GetTotal(ref uint* value)
{
uint* biggestValue = stackalloc uint[1];
for (_i = 0; _i < 26; _i++)
{
if (*biggestValue >= value[_i]) continue;
*biggestValue = value[_i];
}
for (_i = 0; _i < 26; _i++)
{
if (!(*biggestValue).Equals(value[_i])) continue;
_index = _i;
break;
}
Console.WriteLine("The most common char is {0} with {1} hits", (char)Letter[_index], *biggestValue);
}
}
}
I read the entire English bible in under 6ms !
|
|
|
|