Stuart’s MATLAB Videos

Watch and Learn

This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English version of the page.

Video tutorial: 3d indexing 4

Posted by Doug Hull,

The MATLAB user has this:

clear
clc
M(:,:,1) = [1,2;3,4];
M(:,:,2) = [21,22;23,24];
J = [1,2; 2,1];
They want this:
ans =
[1 22
23 4]
They tried this:
D = M(:,:,J) % This doesn't work,
This video discusses this solution:
[nR, nC] = size(J);
D = zeros(nR,nC);
for r = 1:nR
     for c = 1:nC
          D(r,c) = M(r,c,J(r,c));
    end
end     
 

4 CommentsOldest to Newest

Martin le Roux replied on : 1 of 4
What about the following: [nR,nC] = size(J); [r,c] = ndgrid(1:nR,1:nC); M(sub2ind(size(M),r,c,J)) Admittedly it's harder to read, but it might be faster if J is large.
dhull replied on : 2 of 4
Martin, Yes, in MATLAB there are often many ways of doing the same thing. I do not know which one is faster, I suspect that the difference is negligible. As you said, your code is harder to read, so that would make me want to do it another way. Personally, I try to write code that is easy to read and understand. Once it is working, then if there are sections that are slow, I will try more advanced maneuvers like you pointed out to trade readability for speed. As always, thanks for reading and adding, Doug
Hassan replied on : 3 of 4
I am have problem populating 3D matrix using mex file. I have a 3D int array double *outArray; dims[0]=4;dims[1]=2;dims[2]=3; plhs[0]=mxCreateNumericArray(3,dims,mxINT16_CLASS,mxREAL); outArray = mxGetPr(plhs[0]); outArray[0]=12; It gives random numbers in the output. If i do it using 2D matrix I have no problem.. any ideas?
Hassan replied on : 4 of 4
Found the error..should be plhs[0]=mxCreateNumericArray(3,dims,mxDOUBLE_CLASS,mxREAL); instead of plhs[0]=mxCreateNumericArray(3,dims,mxINT16_CLASS,mxREAL);