This question already has an answer here:
MATLAB one liner for batch assignment in 2D matrix?
(1 answer)
Closed 7 years ago.
So I'm a beginner in MATLAB so this question might be trivial.
Suppose x=[1 2 3 4 5] and y=[3 4 2 5 1] and img = zeros(5,5). I want to set img(1,3),(2,4),(3,2),(4,5),(5,1) to 1. How do I do this? When I simply try img(x,y), it takes all the combinations of indices like (1,3),(1,4),(1,2) etc. which is not what I want.
As you have experienced, MATLABs indexing doesn't work that way. To get a feeling for the ways indexing works in MATLAB, please have a look at this nice article from Mathworks.
Now how to tackle your problem: The solution is to use linear indexing. You can always index a 2-dimensional matrix either by (i,j) or with a linear index k which increases column-wise. You can convert between matrix-indexes and linear indexes using the sub2ind function. To get the correct indexes for your questions, use
img = zeros(5,5)
x = [1 2 3 4 5];
y = [3 4 2 5 1];
ind = sub2ind(size(img),x,y);
img(ind) = 1;
Related
This question already has answers here:
Multiply a 3D matrix with a 2D matrix
(10 answers)
Closed 5 years ago.
I try to use svd in my work which will return the vector as below.
A=rand(10,5);
b=rand(10,5,100);
[U, S , V]=svd(A);
What I'm trying to do is to multiply each slice of b with U. With one specific slice, this operation is valid:
c=U'*b(:,:,1);
However when I try to use a vectorized method as below, it return array dimensions mismatch error.
Utran=U.';
c = cellfun(#(x) x.*b,num2cell(Utran,[1 2]),'UniformOutput',false);
I could probably use loop for the first method, but it's not efficient if I have a large matrix. Any idea what's my mistake here?
The following is a vectorized solution.
Not sure if it's faster than using loops; and even if it is, note that it uses more memorry for intermediate computations:
result = permute(sum(permute(conj(U), [1 3 4 2]).*b), [4 2 3 1]);
I want to convert a 2D matrix like A into a 3D matrix. Every slice should be the same content like this:
A=[1 2 3;4 5 6;7 8 9];
for i=1:10
B(:,:,i)=A
end
I need the same code without a loop, which decrease the speed of the program. In the original code A and i are rather big.
You can also try
B = A(:,:, ones(1,10) );
Running a small benchmark on ideone shows this approach significantly faster than bsxfun or repmat
I think the simplest and fastest way is using bsxfun, making use of the fact that it expands singleton dimensions:
A=[1 2 3;4 5 6;7 8 9];
B = bsxfun(#times,A,ones(3,3,10))
Here A is seen as a 3 x 3 x 1 matrix, and the third dimension is expanded to match the corresponding dimension in B (ie. 10).
This question already has answers here:
i want to find the location of a number in a matrix in matlab
(2 answers)
Closed 9 years ago.
Please help me I want to find all zero elements in matrix in MATLAB.
For example, if matrix
A = [1 3 0; 2 4 9; 2 0 7]
the answer should be (1,3) and (3,2).
But the real matrix I want to solve is very big. Is there any way to do this.
use find:
[r c] = find(A==0);
I am trying to access some elements of an array in matlab. Consider the scenario below :
a = [1 2 3;4 5 6;7 8 9]
b = [1 2;2 1]
I want to access elements with indices (1,2) and (2,1) from a. I tried using a(b) etc. But none of the methods I tried worked.
How can this be done in matlab without using loops?
Also it would be helpful if you could suggest some good books for such basics in matlab.
First, convert your subscripts to indices using sub2ind:
dim1sub = b(:,1);
dim2sub = b(:,2);
ind = sub2ind(size(a), dim1sub, dim2sub)
After you have the indices
a(ind)
will give you:
ans =
2
4
See here for more information on matrix indexing.
Matlab lets you access a matrix with a linear index that scans through all the columns of the matrix. So in your case (with a 3x3) a(2,1)=a(2) and a(1,2)=a(4). The answer that #HebeleHododo provided takes your row and column index and converts them into a linear index into matrix a. Just remember that if you want to index a different size matrix, you will need a different linear index for it.
Also, there is a lot of information available online to help with learning matlab at http://www.mathworks.com/help/matlab/index.html#language-fundamentals or you can type doc help into the command window
This question already has an answer here:
Closed 11 years ago.
Possible Duplicate:
How do I divide the rows of a matrix by different values in MATLAB (array division)
I have a matrix A (size MxN) in Matlab and a Vector b with M rows and now I want to divide all elemtens in the i-th row of A by the i-th entry in b like a(i,:)/b(i) but I really don't want to use this sort since I than use a for-loop and I definitly need a FAST solution!
Could anybody help out? Thanks!
Edit: Somehow I just came up with it after posting... My solution is bsxfun(#rdivide, [1 1; 2 2; 3 3], [2 2 6]'), do you think that's a good and fast one?
You want to use bsxfunc :
bsxfun(#rdivide,A,B)
http://www.mathworks.com/help/techdoc/ref/bsxfun.html