Comparing Matrices in a Struct

조회 수: 2 (최근 30일)
Chris Dan
Chris Dan 2019년 10월 27일
편집: per isakson 2019년 11월 10일
Hello Guys, I am new to MATLAB, I have some matrices in a struct more like an array of arrays.
I want to compare their sizes and see if they are equal or not.
and how to make them equal to the biggest matrice, maybe by adding zeros to the smaller matrices.
I am attaching a picture

채택된 답변

per isakson
per isakson 2019년 10월 28일
편집: per isakson 2019년 11월 8일
Try this
S(1).model_data = rand( 4, 10 );
S(2).model_data = rand( 2, 10 );
S(3).model_data = rand( 3, 11 );
Out = cssm_( S );
function Out = cssm_( S )
sz(1) = max( arrayfun( @(s) size( s.model_data, 1 ), S ) );
sz(2) = max( arrayfun( @(s) size( s.model_data, 2 ), S ) );
Out = struct( 'model_data', repmat( {nan(sz)}, 1,numel(S) ) );
for jj = 1 : numel(S)
sz = size(S(jj).model_data);
Out(jj).model_data(1:sz(1),1:sz(2)) = S(jj).model_data;
end
end
In response to comment
This will handle sparse, test it. ( cssm_ assumes that all values of data_model are either full or sparse.)
S(1).model_data = sparse( rand( 4, 10 ) );
S(2).model_data = sparse( rand( 2, 10 ) );
S(3).model_data = sparse( rand( 3, 11 ) );
Out = cssm_( S );
function Out = cssm_( S )
sz(1) = max( arrayfun( @(s) size( s.model_data, 1 ), S ) );
sz(2) = max( arrayfun( @(s) size( s.model_data, 2 ), S ) );
if issparse( S(1).model_data )
Out = struct( 'model_data', repmat( {sparse(nan(sz))}, 1,numel(S) ) );
else
Out = struct( 'model_data', repmat( {nan(sz)}, 1,numel(S) ) );
end
for jj = 1 : numel(S)
sz = size(S(jj).model_data);
Out(jj).model_data(1:sz(1),1:sz(2)) = S(jj).model_data;
end
end
Version 3 in response to a later comment
S(1,1).model_data = sparse( rand( 4, 3 ) );
S(1,2).model_data = sparse( rand( 2, 3 ) );
S(1,3).model_data = sparse( rand( 3, 5 ) );
Out = cssm_( S );
function Out = cssm_( S )
sz(1) = max( arrayfun( @(s) size( s.model_data, 1 ), S ) );
sz(2) = max( arrayfun( @(s) size( s.model_data, 2 ), S ) );
if issparse( S(1).model_data )
Out = struct( 'model_data', repmat( {sparse(nan(sz))}, size(S) ) );
else
Out = struct( 'model_data', repmat( {nan(sz)}, size(S) ) );
end
for jj = 1 : numel(S)
sz = size(S(jj).model_data);
Out(jj).model_data(1:sz(1),1:sz(2)) = S(jj).model_data;
end
end
  댓글 수: 8
Chris Dan
Chris Dan 2019년 11월 10일
편집: per isakson 2019년 11월 10일
Hey, Thanks again for you help!! :) :)
I just have one more question, it is a different problem but is related matrix addition.
I am copying my code, the thing is I have the logic developed somehow, but it is not giving me correct answers.
B = [ 1 -1 1;
-1 1 1;
1 -1 1];
C = [ 1 -1 2;
-1 1 2;
4 5 5];
D = [ 1 -1 1;
-1 1 4;
5 6 7];
T = zeros(7,7)
d=zeros(3,3,3);
d(:,:,1) = B;
d(:,:,2) = C;
d(:,:,3) = D;
for k = 1:1:3
for i = 1:1:3
for j = 1:1:3
T((i+k)-1,(j+k)-1) = T((i+k)-1,(j+k)-1) + d(i,j,k)
end
end
end
The answer which I am getting is this : which is wrong
What should I get is
T = [ 1 -1 1 0 0 0 0
-1 1 1 0 0 0 0
1 -1 2 -1 2 0 0
0 0 -1 1 2 0 0
0 0 4 5 6 -1 1
0 0 0 0 -1 1 4
0 0 0 0 5 6 7]
If it is possible, can you help me and tell me what mistake I am making, that would be very nice :)
per isakson
per isakson 2019년 11월 10일
편집: per isakson 2019년 11월 10일
It's far from obvious to me what algorithm you try to implement and I cannot easily deduce it from the example.
Regarding your code I directly observe that
  • all T_actual(6:7,:) and all T_actual(:,6:7) are equal to zero
  • the maximum values of the counters, k, i, j, are 3
  • the maximum value of (i+k)-1 and (j+k)-1, respectively is 5, which explains why all T_actual(6:7,:) and all T_actual(:,6:7) are equal to zero
  • all T_actual(5,1:5)==T_expected(7,3:7)
Proposal: Post a new question in which you describe in some detail the algorithm you try to implement.

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by