Add your own alternative version
Stats
233.3K views 18.4K downloads 70 bookmarked
Posted
1 Jun 2007

Comments and Discussions


This will fix it. Remember, the + method will have the same problem. so do something similar to this will fix it.
hope this help
public static Matrix operator (Matrix A, Matrix B)
{
Matrix c = A.Clone();
if (c.RowCount != B.RowCount  c.ColumnCount != B.ColumnCount)
throw new ArgumentException("Matrices must be of the same dimension.");
for (int i = 1; i <= c.RowCount; i++)
{
for (int j = 1; j <= c.ColumnCount; j++)
{
c[i, j] = B[i, j];
}
}
return c;
}





We now use this where I work, best library we could find.






There is a solution to an Inverse bug by eshark11 a few posts down, see if it helps.





I can't see any function for matrix multiplication in the CSML?





There is! It's through operation overloads, so it's just to write C = A*B





Just exactly what I need...





dont' work correct. Убейся бляць об стену, только сложение и вычитание правильно работает!!!





dont' work correct. Убейся бляць об стену, только сложение и вычитание правильно работает!!!





Great library, Hanzzoid. Hope you return to this project some day.
In the meantime there is a bug which causes a "Warning: Matrix close to singular." exception, which we found during matrix.Inverse() and would also affect Solve and Determinant.
The solution is easy, and requires moving two lines down a little. All users of this library should do this.
1. Open the Matrix.cs file
2. Find this exception at line 1935 in LUSafe()
if (this[j, j] == 0)
throw new DivideByZeroException("Warning: Matrix close to singular.");
3. Move those two lines down by 14 lines so they are inside the loop at 1949
for (int i = j + 1; i <= n; i++)
{
this[i, j] = this[i, j] / this[j, j];
}
4. The result should look like this
for (int i = j + 1; i <= n; i++)
{
if (this[j, j] == 0)
throw new DivideByZeroException("Warning: Matrix close to singular.");
this[i, j] = this[i, j] / this[j, j];
}
This is for the code version 0.9 (Last Update: July 4, 2007)
Hope this helps someone,
Regards,
David Pierson





Hi Hanzzoid,
I'm kinda new to C#, but i'm trying to do simple Matrix calculations (inverse, transpose, vandermonde) which I see your program is very capable of. Due to the software and hardware I must work with, I've had to downgrade to using visual studio 2003. When trying to add csml.dll as a reference it is not recognised as proper COM or DLL file. And when I tried recompiling the source code, it says that the files are visual studio but a newer version and that I am unable to access them. I'm wondering is there a work around for this, or is there any other software that you could recommend that would accomplish this task?
Cheers,
Raymas





Raymas,
Instead of using the DLL, just add the two files Matrix.cs and Complex.cs to your project as source code files and compile them in.
You will need to do that anyway to fix the bug affecting Inverse, the solution to which I posted a minute ago.
Cheers,
David





Thanks David! It's working awesome now!





Great library has helped me plenty while working with MatLab code to C#, highly recommended.





I have computed a Matrix from which I now want to retrieve its values to write it into an doublearray. I read all the other topics but I found no way to do that.
Example
double data[i] = testMatrix[1,5];
testMatrix is of type Complex
Can someone help?
modified on Sunday, May 23, 2010 7:10 AM





I believe it is
double data[i] = testMatrix[1,5].Re;
When you access a matrix cell, you get a Complex Number, from which you may take the Real part. Hope it helps.





Hi this is the same doubt of the previous user.
Imagine that we have matrix A and B, and we perform an operation such as:
Matrix C = A.Inverse() * B;
How can I access to the double value of C[1,1]?
If I try:
double value = C[1, 1];
I get this error:
error CS0029: Cannot implicitly convert type 'WindowsFormsApplication1.Complex' to 'double'
Help me please!
Regards





You can write C[1,1].Re  this is the real value of the entity and will return a double instead of a Complex. There might be other solutions aswell..





i want to retrieve an index value say matrix[1][2] as an int value
how can i achieve that?
what i am trying is:
public static int matrix2int(Matrix m, int i, int j)
{
return (int)m.Row(i).Values[j1];
}
please help me i am waiting.





Hi there,
I had the same confusion as you are.
Since the matrix in arraylist, you can access individual element by m[i,j] directly. Go and try, it's in double.





@hanzzoid: Have there been any new developments recently? I noticed you mentioned a v0.91; was this ever released? The version available from this page has a few NotImplementedExceptions that I was wondering if you'd fixed.





There is a bug in matrix inverse. I was trying to invert a 12 by 12 matrix and the determinant of the matrix was non zero(very big number) and the the code is giving a error message that matrix is singular. I checked the singular values of the matrix and they were all positive and the smallest one was 4. So i think inverse code should be fixed.





Any bug fixes for inverse??
Its not working for me too





I have also problems with inverse





Yes this is a bug and there is an easy fix.
See my post "Solution to Bug affecting Inverse/Solve/Determinant easy code fix".





Hi, guys,
after I download and rebuild CSML on my computer, the following information is listed:
1. unreachable code detected in File Matrix.cs Line 2184 of project CSML
2. unreachable code detected in File Matrix.cs Line 2269 of project CSML
1. unreachable code detected in File Matrix.cs Line 2301 of project CSML
Do I ignore these 3 warnings? fankly, I want to exclude these 3 warnings.
Could you tell me how to sovle it? the CSML DLL is still generated.
Thanks in advance!
Dingjun





Hi!
Using HorizontalConcat to concatenate two matrices each containing one row doesn't work. It places the first row as a column vector in the first column and adds the second row as a row vector in a new row after the last element of the previous column vector.





I noticed this as well and traced the bug back to the Rowfunction.
Change the following line:
Matrix buf = new Matrix(columnCount, 1);
to:
Matrix buf = new Matrix(1, columnCount);
and both Row and HorizontalConcat will start working.
/Håkan MacLean





Hi,
I used the normal Inverse()Methode and got a lot of "n.def ..." entries at console which should
be 0. The debugger shows me that all values of that entries (Re,Im etc.) are NaN (constant for not a number).
The InverseLeverrier()Method works fine and places 0 instead of that "n.def ...".
In Mathematica I also get 0.
What could be the reason for that ?
Thanks and greatings.





Hello,
I'm new to this so please excuse this probably simple question...
I have a 6x6 float array 'fa' that has been filled with data by another function. I would like to get the inverse of this written back to 'fa'. Is this possible and if so I would appreciate some advice as I can't seem to find the answer in the documentation.
Thanks in advance





When I write
Matrix d = b  a;
b changes. How come?





Fixed in 0.91, thanks for the hint.
(in Matrix operator() and Matrix operator+() in Matrix.cs,
I accidentally changed the first matrix parameter)





How do we get the latest version?
I still found that the operator is not behaving as it should in the current version. For example, C= A * B will cause operation in A to become A.
I think most of the operation assume passing parameter by value, while they actually are being passed by reference.
It's a great work, really. A lot of people really like this library.





problem solveing matrix, Great!






Hi hanzzoid,
Great library! Very useful! Thank you!
I just noticed that your HorizontalConcat() does
not work at all. If you change one line in it
(make C be the transpose of first row of A), then
this function becomes a working Vertical Concatination
algorithm. Also, your VerticalConcat() works as
Horizontal Concatenation.
Bottomline: the names appear flipped and one of
the functions has a bug.
I might be wrong, but I thought I'd let you know,
so that you can double check.
Alexei





Ouch! Fixed in 0.91, thank you.





Hi. Excellent work. Though I need to calculate the inverse of a m x n matrix while the class can only calculate it when the matrix is n x n. In matlab the operation is A\B, which is equibalent to inv(A)*B when A is n x n, but when not is a bit more complicated.
Can anybody help me with this calculation?
Thanks!;P
MeMyself





According to maths rules, only nonsingular square matrices can be inverted





As far as I know, nonsquare matrices cannot be inverted.
Although, if you want to solve
Ax = b
where A is nonsquare, you can equivalently solve
(A'A)x = A'b
where A' is the transpose of A > (A'A) is square; iff
a unique solution exists, (A'A) is invertible.





Hello, I tried to use this class in my project, but I had to throw it away! I wanted to compute inverse matrix of Hermite spline form, but the library crashed saying something like "Matrix almost singular!" in LU.
I computed it by hand  much faster than using a computer. However, I still have to find some other library to use with my project...





Is it possible to make operations between matrixs? such as sum or multiplication...





I just updated to the latest version of CSML. When writing
Matrix Test = new Matrix(4, 4);
Test[1,1]=1;
I get the error message that the conversion from int to complex is not possible. How can I use the assignment Test[1,1]=1; as in the older versions of CSML? Or is this not possible any more?





That confused me too. The solution is to define a new Complex value, e.g.
Test[1,1] = new Complex(1);





It would be great if meanful XML comments could be done for each method and property, so that it compiles without any warnings under Visual Studio 2005.
Thanks,
Daniel





I quite believe I commented like hell. Do blame me for my wordiness, or for silly bugs, but the three warnings (or so) "unreachable code detected" come from unrelased methods, which do begin with a "System.NotImplementedExecteption".





That was not a blame, but a suggestion. When I compile, I have about 60 warnings due to the fact that there are no comments on the methods or properties. Maybe it's due to the fact that I have ghostdoc installed or something else. I am sure you will do well on those comments
Thanks for your work.





The warnings that you are receiving and hanzzoid isn't, are probably due to the fact that your project in VS is set to compile the XML comments. This creates an XML file alongside the output library that includes all of the comments that describe the structures provided by the library. This can be beneficial if you want to provide the library as a standalone, without the source code, to another party that will need to know what the library does and how to use it.
If you don't need to worry about this you can turn off the XML comment compiling. To turn them off you can do the following:
 Open up the project in VS.
 Right click on the project in the "Solution Explorer" and choose Properties.
 In the properties page select the "Build" tab.
 Near the bottom there is a section titled "Output".
 In this section, there should be a checkbox that specifies to build the XML documentation file. If you deselect this checkbox, you won't have to worry about the compiler complaining about missing XML comments.
This setting is stored on a per project basis, so if multiple projects are complaining, you will have to do this for each project. There probably is a way to set the default project to have this either set or unset, but I don't know it.





Hello, squid 314.
Yes, you are right. This is the reason why I am getting these warnings, due to the XML comments which are missing.
I need it for my project, so I cannot get rid of them. This is why I suggested to add the XML comments. Anyway this doesn't hurt, as it helps anyone who is willing to understand the code, and is a good practice.
Thanks for your clarification.
Daniel





Hi,
the source code doesn't contain the implementation of the EigenVector method while the Update June 29 2007 includes its implementation.
Thanks.






General News Suggestion Question Bug Answer Joke Praise Rant Admin Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

