Hi all,
Imagine there is function which takes a matrix as input, perform some operations to each element, and gives an output of same dimension matrix. The dimension of the input matrix can be random. For example:
clear; clc;
% the 1d case.
inpt1d = [1 2 3]';
otpt1d = zeros(3, 1);
for i = 1:3
% the operation is square root.
otpt1d(i) = sqrt(inpt1d(i));
end
% the 2d case.
inpt2d = [1 2 3; 4 5 6; 7 8 9]';
otpt2d = zeros(3, 3);
for i = 1:3
for j = 1:3
otpt2d(i, j) = sqrt(inpt2d(i, j));
end
end
Here in the example I manually set i and j for 2d case. However if I want the input to suit any dimension, I cannot set the index manually any more. So for this kind of problem, if I'd like to deal with any dimensions with for loop, how should I do it?
Thanks!

댓글 수: 1

Greg
Greg 2017년 11월 8일
편집: Greg 2017년 11월 8일
MATLAB inherently understands linear-indexing, do some Google searching on those terms and you should learn you only ever need a single loop (with maybe a tiny bit of slick pre-allocation).

댓글을 달려면 로그인하십시오.

 채택된 답변

KL
KL 2017년 11월 8일
편집: KL 2017년 11월 8일

1 개 추천

EDITED
First you should make sure if loop is required at all in the first place, if yes then I would suggest linear indexing and reshape.
For example
A = rand(3,3,3);
B = A(:);
now it's just a column vector. you could use a single loop with numel(). and once you are done, you could reshape it like
C = reshape(B,size(A))

댓글 수: 3

Greg
Greg 2017년 11월 8일
I think you missed the question. He is looking for an N-D nested loop solution.
KL
KL 2017년 11월 8일
Ah yes, I totally misread it, thanks Greg.
The "tiny bit of slick pre-allocation" I referred to in my comment to the original question negates the reshape:
A = rand(3,3,3);
B = 0.*A; % or B = NaN.*A;

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Creating and Concatenating Matrices에 대해 자세히 알아보기

태그

질문:

2017년 11월 8일

댓글:

2017년 11월 8일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by