Store sets of values as indices in a matrix?

BOB (view profile)

on 10 Sep 2018
Latest activity Commented on by BOB

BOB (view profile)

on 10 Sep 2018
Accepted Answer by Guillaume

Guillaume (view profile)

Hi,
I have a function which produces a set of horizontal and vertical graph axes intercepts. There are 120 sets of these intercepts:
for Z = 1:120
hrz = hix(x(:,Z),mb(:,Z))'; %[X Y] Matrix of horizontal intercepts
vrt = vix(y(:,Z),mb(:,Z))'; %[X Y] Matrix of vertical intercepts
end
I want to store each of these sets of intercepts in a matrix, i.e. I want to be able to call the second set of intercepts by simply calling matrix(2).
Is anyone aware of a way to achieve this?
Thanks

Guillaume (view profile)

on 10 Sep 2018

I'm assuming that hix and vix are functions, and I'm assuming that for each pair of vector input, they each return a vector of the same size as the input. In which case,
hrz = zeros(size(x)); %predeclare output matrix
vrt = zeros(size(x));
for Z = 1:120
hrz(:, Z) = hix(x(:, Z), mb(:, Z));
vrt(:, Z) = vix(y(:, Z), mb(:, Z));
end

BOB

BOB (view profile)

on 10 Sep 2018
And the error returned is "Assignment has more non-singleton rhs dimensions than non-singleton subscripts"
Guillaume

Guillaume (view profile)

on 10 Sep 2018
store the different length vector of each iteration of the loop in a single matrix.
Ah! That needed explaining in the question. By definition, a matrix has the same number of rows/columns for each column/row. So you can't store results of varying length in a matrix unless you pad the shorter ones (which is rarely a good approach).
You can store the results in a cell array though:
hrz = cell(1, size(x, 2)); %preallocate output
vrt = cell(1, size(x, 2));
for Z = 1:size(x, 2) %better not to hardcode the size
hrz{Z} = hix(x(:, Z), mb(:, Z));
vrt{Z} = vix(y(:, Z), mb(:, Z));
end
BOB

BOB (view profile)

on 10 Sep 2018
That works perfectly! Thanks for the persistence, I'll make sure to be more clear next time.