How to replace element matrix with the other matrix?

6 次查看(过去 30 天)
What if I have a matrix A (4x4) with a size of (1x64 cell), and the matrix B (2x2) with size of (1x64 cell)? And I want to replace all of the matrix A.
  7 个评论
Bjorn Gustavsson
Bjorn Gustavsson 2014-2-7
OK, this doesn't really work if you cant communicate clearly what A and B are. Instead of describing in words, paste the output of
whos A B
and in case A and B are a cell arrays also
size(A{1})
size(B{1})
Andi Tarigan
Andi Tarigan 2014-2-7
Do you mean like this?
>> A = Mmid1_blue_new;
>> whos A
Name Size Bytes Class Attributes
A 1x64 9216 cell
>> B = blok_blue_dwt_dct_HL13;
>> whos B
Name Size Bytes Class Attributes
B 1x64 15360 cell

请先登录,再进行评论。

回答(6 个)

Image Analyst
Image Analyst 2014-2-7
OK, so both A and B are 1 by 64 cell arrays. And you say "And I want to replace all of the matrix A." Presumably replace A with B. So you do this:
A = B;
  2 个评论
Andi Tarigan
Andi Tarigan 2014-2-8
But the size different, matrix A is 4x4 and matrix B 2x2. I just want to replace the middle matrix A(size 2x2) with matrix B.
Image Analyst
Image Analyst 2014-2-8
A is NOT 4 by 4. It is 1 by 64. You don't understand the concept of cell arrays. I really really suggest you read the FAQ on it: http://matlab.wikia.com/wiki/FAQ#What_is_a_cell_array.3F
Plus, you and I must have different definitions of "all". To me, your "all" means a subset (2x2 out of 4x4).

请先登录,再进行评论。


Bjorn Gustavsson
Bjorn Gustavsson 2014-2-7
OK, then I suggest that (unless you definitely need the cell-array A as a cell-array) you first change A and B to 3-D matrices and put in B in A:
A = cat(3,A{:});
B = cat(3,B{:});
A(2:3,2:3,:) = B;
HTH.
  2 个评论
Andi Tarigan
Andi Tarigan 2014-2-8
But I get error when I type:
>> B = cat(3,B{:});
Cell contents reference from a non-cell array object.
and
>> A(2:3,2:3,:) = B;
Subscripted assignment dimension mismatch.
Bjorn Gustavsson
Bjorn Gustavsson 2014-2-8
Well, are you sure that B is a cell array at the time you call cat and you have the same sized (2 x 2) arrays in all cells of B?
The solution I suggested works in matlab 2013a...

请先登录,再进行评论。


Jos (10584)
Jos (10584) 2014-2-7
I suggest that you give a smaller example of A and B and the required output.
  3 个评论
Jos (10584)
Jos (10584) 2014-2-8
So you want the central portion of B to be replaced with A.
What do you mean with "I have 64 pieces of both that matrix"?
Bjorn Gustavsson
Bjorn Gustavsson 2014-2-8
Well that's completely opposite of your initial description of the sizes...
B(2:3,2:3) = A;
Would be what you'd do for that. For the case that B is 3-D you'd modify it to:
B(2:3,2:3,:) = A;

请先登录,再进行评论。


Walter Roberson
Walter Roberson 2014-2-8
newA = cellfun(@(a,b) subsasgn(a, struct('type', '()', 'subs', {2:3, 2:3}), b), A, B, 'Uniform', 0);
I think.
  2 个评论
Andi Tarigan
Andi Tarigan 2014-2-8
But I get error when type it:
>> newA = cellfun(@(a,b) subsasgn(a, struct('type', '()', 'subs', {2:3, 2:3}), b), A, B, 'Uniform', 0);
Error using cellfun
Input #2 expected to be a cell array, was double instead.
Walter Roberson
Walter Roberson 2014-2-8
newA = cellfun(@(a) subsasgn(a, struct('type', '()', 'subs', {2:3, 2:3}), B), A, 'Uniform', 0);

请先登录,再进行评论。


Jos (10584)
Jos (10584) 2014-2-8
To replace the central portion of B with A try this
% example data
A = 2 * ones(2,2)
B = -3 * ones(6,8)
% engine
szA = size(A)
szB = size(B)
tf = false(szB)
tf(1:szA(1),1:szA(2)) = true
tf = circshift(tf,(szB-szA)/2)
B_output = B
B_output(tf) = A

Jos (10584)
Jos (10584) 2014-2-8
Even simpler:
% example data
A = 99 * ones(2,2)
B = -1 * ones(6,8)
% engine
szA = size(A)
i0 = (size(B)-szA)/2
B_output = B ;
B_output(i0(1)+1:i0(1)+szA(1), i0(2)+1:i0(2)+szA(2)) = A

类别

Help CenterFile Exchange 中查找有关 Multidimensional Arrays 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by