Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
544 views
in Technique[技术] by (71.8m points)

matlab - Applying a function on array that returns outputs with different size in a vectorized manner

How to apply a function that returns non scalar output to arrays using arrayfun?

For example - How to vectorize the following code?

array = magic(5);
A = cell(size(array));
for i=1:5
    for j=1:5
      A{i,j} = 1:array(i,j);
    end
end

This naive attempt to vectorize does not work, because the output is not a scalar

array = magic(5);
result = arrayfun(@(x)(1:x),array);
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

There are 2 methods to achieve it:

It is possible to set 'UniformOutput' to false. Then, the result is a cell array.

   result = arrayfun(@(x)(1:x),array,'UniformOutput',false);

But there is a nice trick that I have found today, the function itself can return a cell. This removes the need of typing 'UniformOutput',false each and every time.

    result = arrayfun(@(x){1:x},array)

What is really interesting here that I don't have to type @(X)({1:x}) but I can define it only by using curly bracers @(X){1:x}

Edit(1): As @Jonas correctly points out, there is no wonder that the regular bracers () are not needed, as they are optional. For example, @(x) x+1 is a valid syntax.

Edit(2): There is a small difference between using the curly bracers method or the UniformOutput,false. When the input array is empty, their behavior is different.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...