MATLAB Answers

subsref works as not expected

17 views (last 30 days)
Let's create random cell array.
test = {1,2,3,4};
And try to evaluate simple code
res_1 = ones(subsref(test, substruct('{}', {':',':'})));
res_2 = ones(test{:, :});
Results unmatch but it should to match according with subsref help. Why?
Is there any way to unpack cell array without direct access through {:}?


Sign in to comment.

Accepted Answer

Bruno Luong
Bruno Luong on 12 Jan 2021
Edited: Bruno Luong on 12 Jan 2021
I knew it for sometime: subsref never work to emulate comma list (not sure if it's documented), because a non trivial comma list (with length > 1) can never be considered as function output .
This limitation surely deserves to be in "what frustrates you ..." thread.


Sergey Kasyanov
Sergey Kasyanov on 12 Jan 2021
Do you know any way to use {:} with function output?
I mean that way:
res_1 = ones(some_function(var_1, var_2){:})
Bruno Luong
Bruno Luong on 12 Jan 2021
First MATLAB won't allow such cascade syntax (this deserves to be "what frustrates you ..." thread as well)
some_function(var_1, var_2){:}
>> num2cell(1:3)
ans =
1×3 cell array
{[1]} {[2]} {[3]}
>> num2cell(1:3){:}
Error: Indexing with parentheses '()' must appear as the last operation of a valid indexing expression.
The best you can do is this
A = rand(3,4,5)
idx = some_function(1:2,3:4,':');
B = A(idx{:})
function c = some_function (varargin)
c = varargin;
But then the function some_function is not useful in any way. Just work directly with cell and comma list will do the same job:
A = rand(3,4,5)
idx = {1:2,3:4,':'};
B = A(idx{:})

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!