Matlab weirdness: Creating Logical Arrays and Accessing Sparse Matrices
While trying out the new Constrained Parametric Min Cuts code, I came across some Matlab weirdness.
The first situation was this:
Given a huge sparse matrix X and some row and column indices r and c, I wanted to pick out these elements.
As usual, I called
That seemed a little weired, since "ind" wasn't that long.
It seemed to me as if the matrix is converted into a full (=dense) matrix before the linear indexing took place.
After quite some thinking and searching on the web, I came across a post about the same problem.
Apparently the "correct" solution to my problem is:
The next thing that really puzzled me was this:
At some point in the code, a large logical array has to be generated.
This was done with zeros().
I thought to myself "Well this is no good. This surely should be a logical array."
And so I tried
While
Again, the web helped out.
The "correct" solution here is to do
The first situation was this:
Given a huge sparse matrix X and some row and column indices r and c, I wanted to pick out these elements.
As usual, I called
ind=sub2ind(size(X),r,c) Y=X(ind)... and got an out of memory error.
That seemed a little weired, since "ind" wasn't that long.
It seemed to me as if the matrix is converted into a full (=dense) matrix before the linear indexing took place.
After quite some thinking and searching on the web, I came across a post about the same problem.
Apparently the "correct" solution to my problem is:
[I J x]=find(X); [tf loc]= ismember([r(:) c(:)],[I J],'rows'); Y = zeros(size(tf)); Y(tf) = x(loc(tf));why this is so, I have no idea. Maybe someone can clear this up for me.
The next thing that really puzzled me was this:
At some point in the code, a large logical array has to be generated.
This was done with zeros().
I thought to myself "Well this is no good. This surely should be a logical array."
And so I tried
X=zeros(w,h,'logical')... and failed.
While
X=zeros(w,h,'int8')worked perfectly.
Again, the web helped out.
The "correct" solution here is to do
X=false(w,h)Who would have thought.
Thanks for posting. X=false(w,h) is exactly what I was looking for
ReplyDelete