summyia haris
summyia haris

Reputation: 121

how to check the values of each variables from a resultant matrix in matlab?

I have sum of 3 cell arrays

A=72x1
B=72x720
C=72x90
resultant=A+B+C
size of resultant=72x64800

now when I find the minimum value with row and column indices I can locate the row element easily but how can I locate the column element in variables? for example after dong calculations for A,B,C I added them all and got a resultant in from of <72x(720x90)> or can say a matrix of integers of size <72x64800> then I found the minimum value of resultant with row and column index using the code below.

[minimumValue,ind]=min(resultant(:));
  [row,col]=find(result== minimumValue);

then row got 14 and column got 6840 value.. now I can trace row 14 of all A,B,C variables easily but how can I know that the resultant column 6480 belongs to which combination of A,B,C?

Upvotes: 0

Views: 84

Answers (1)

EBH
EBH

Reputation: 10440

Instead of using find, use the ind output from the min function. This is the linear index for minimumValue. To do that you can use ind2sub:

[r,c] = ind2sub(size(resultant),ind);

It is not quite clear what do you mean by resultant = A+B+C since you clearly don't sum them if you get a bigger array (72x64800), on the other hand, this is not a simple concatenation ([A B C]) since this would result in a 72x811 array.

However, assuming this is a concatenation you can do the following:

% get the 2nd dimension size of all matrices:
cols = cellfun(@(x) size(x,2),{A,B,C}) 
% create a vector with reapiting matrices names for all their columns:
mats = repelem(['A' 'B' 'C'],cols);
% get the relevant matrix for the c column:
mats(c)

so mats(c) will be the matrix with the minimum value.


EDIT:

From your comment I understand that your code looks something like this:

% arbitrary data:
A = rand(72,1);
B = rand(72,720);
C = rand(72,90);
% initializing:
K = size(B,2);
N = size(C,2);
counter = 1;
resultant = zeros(72,K*N);
% summing:
for k = 1:K
    for n = 1:N
        resultant(:,counter) = A + B(:,k) + C(:,n);
        counter = counter+1;
    end
end
% finding the minimum value:
[minimumValue,ind] = min(resultant(:))

and from the start of the answer you know that you can do this:

[r,c] = ind2sub(size(resultant),ind)

to get the row and column of minimumValue in resultant. So, in the same way you can do:

[Ccol,Bcol] = ind2sub([N,K],c)

where Bcol and Ccol is the column in B and C, respectively, so that:

minimumValue == A(r) + B(r,Bcol) + C(r,Ccol)

To see how it's working imagine that the loop above fills a matrix M with the value of counter, and M has a size of N-by-K. Because we fill M with a linear index, it will be filled in a column-major way, so the row will correspond to the n iterator, and the column will correspond to the k iterator. Now c corresponds to the counter where we got the minimum value, and the row and column of counter in M tells us the columns in B and C, so we can use ind2sub again to get the subscripts of the position of counter. Off course, we don't really need to create M, because the values within it are just the linear indices themselves.

Upvotes: 2

Related Questions