the tranpose of transpose doed not equals the original matrix
조회 수: 4 (최근 30일)
이전 댓글 표시
I find that on my data(see the attachment) ,the tranpose of transpose doed not equals the original matrix. This is my code. I donot understand why (a')' does not equals a. My matlab version is R2022a.
load("a.mat")
norm((a')' - a, 'fro')
댓글 수: 0
채택된 답변
Walter Roberson
2023년 10월 30일
이동: Walter Roberson
2023년 10월 30일
You have a broken sparse matrix, probably build by a third-party product, but possibly built by a broken mex file.
See a similar discussion at https://www.mathworks.com/matlabcentral/answers/1954909-sparse-matrix-entries-are-not-displayed-correctly#answer_1225544
load("a.mat")
whos a
at = a';
att = at';
whos a at att
mask = att ~= a;
locs = find(mask, 1)
a(locs)
at(locs)
att(locs)
d = att - a;
max(d(:))
min(d(:))
nnz(imag(d))
댓글 수: 2
James Tursa
2023년 10월 30일
편집: James Tursa
2023년 10월 30일
I see that Tim Davis's SPOK has been removed from the FEX. I will write a replacement and upload it when I get some free time, maybe this weekend. Should I call it SPOK for consistency in searches or give it a new name?
추가 답변 (1개)
James Tursa
2024년 1월 23일
편집: James Tursa
2024년 1월 23일
I finally finished my sparse matrix integrity checker. You can find it in the FEX under the name SAREK (I think you will be able to figure out the inside joke):
Here is what it reports for the posted matrix:
>> sarek(a)
SAREK -- Sparse Analyzer Real Et Komplex , by James Tursa
Compiled in version R2023a (with -R2018a option)
Running in version R2023a
Matrix is double ...
Matrix is real ...
M = 30084 >= 0 OK ...
N = 1 >= 0 OK ...
Nzmax = 9862 >= 1 OK ...
Jc[0] == 0 OK ...
Jc[N] = 9862 <= Nzmax = 9862 OK ...
Jc array OK ...
ERROR: There are 9861 Ir entries out of order or out of range
TO FIX: [M,N] = size(A); [I,J,V] = find(A); B = sparse(I,J,V,max(max(I),M),N);
All stored elements nonzero OK ...
There were ERRORS found in matrix!
ans =
9861
And if you plot the row indexes, you can see that the matrix was built in reverse order since they are all decreasing!
>> [I,J,V] = find(a);
>> plot(I)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1597451/image.jpeg)
After applying the recommended fix and re-plotting you can see that the row indexing order has been corrected:
>> [M,N] = size(a); [I,J,V] = find(a); B = sparse(I,J,V,max(max(I),M),N);
>> sarek(B)
SAREK -- Sparse Analyzer Real Et Komplex , by James Tursa
Compiled in version R2020a (with -R2018a option)
Running in version R2020a
Matrix is double ...
Matrix is real ...
M = 30084 >= 0 OK ...
N = 1 >= 0 OK ...
Nzmax = 9862 >= 1 OK ...
Jc[0] == 0 OK ...
Jc[N] = 9862 <= Nzmax = 9862 OK ...
Jc array OK ...
Ir array OK ...
All stored elements nonzero OK ...
All sparse integrity checks OK
ans =
0
>> [I,J,K] = find(B);
>> plot(I)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1598031/image.jpeg)
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Operating on Diagonal Matrices에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!