Divide and expand matrix

조회 수: 4 (최근 30일)
Andrew Poissant
Andrew Poissant 2017년 7월 7일
편집: dpb 2017년 7월 8일
I have a 600x600 matrix with integer values in each cell. What I want to do is expand that matrix into a 6,000x6,000 matrix. However, since it is being expanded to 10x its size, I need to scale the integer in each cell accordingly. So if I have the value 10 in row 1 column 1 of the 600x600 matrix, I now need the value 1 in rows 1-10 columns1-10. Does anyone have any ideas how to do this?
  댓글 수: 2
Geoff Hayes
Geoff Hayes 2017년 7월 7일
Andrew - what happens if the value in row 1 column 1 (or any other position) is not divisible by ten? (Since you are saying that the value 10 at (1,1) must be 1 in (1:10,1:10).)
Andrew Poissant
Andrew Poissant 2017년 7월 7일
Well they become decimals. I did not specify that they do not have to be integers but the starting numbers are.

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

채택된 답변

dpb
dpb 2017년 7월 7일
편집: dpb 2017년 7월 8일
Something like this you mean:
>> x=reshape(1:9,3,3) % starting sample input array
x =
1 4 7
2 5 8
3 6 9
>> N=2; % choose a multiplier size factor
>> xnew=cell2mat(arrayfun(@(x) repmat(x,N,N),x,'uniform',0))
xnew =
1 1 4 4 7 7
1 1 4 4 7 7
2 2 5 5 8 8
2 2 5 5 8 8
3 3 6 6 9 9
3 3 6 6 9 9
>>
ADDENDUM To divide down is as you surmise, just use N as divisor in the anonymous function--for the same x
>> cell2mat(arrayfun(@(x) repmat(x,N,N)/N,x,'uniform',0))
ans =
0.5000 0.5000 2.0000 2.0000 3.5000 3.5000
0.5000 0.5000 2.0000 2.0000 3.5000 3.5000
1.0000 1.0000 2.5000 2.5000 4.0000 4.0000
1.0000 1.0000 2.5000 2.5000 4.0000 4.0000
1.5000 1.5000 3.0000 3.0000 4.5000 4.5000
1.5000 1.5000 3.0000 3.0000 4.5000 4.5000
>>
ADDENDUM 2: Of course, if N is constant as above, it can come outside the anonymous function--
cell2mat(arrayfun(@(x) repmat(x,N,N),x,'uniform',0))/N
If it were a positional transform, the anonymous function could have a second argument of size(x) if need be or the dot division operator or automagic singleton expansion in later versions could come into play depending on just what a particular transformation looked like.
  댓글 수: 2
Andrew Poissant
Andrew Poissant 2017년 7월 7일
That is nearly what I want but I need to scale down the numbers. So you double the number of rows and columns so each number in the cells should be halved. How do I go about doing that? Just divide each element in the matrix by N?
dpb
dpb 2017년 7월 7일
편집: dpb 2017년 7월 7일
Ayup...just modify the anonymous function to @(x) repmat(x,N,N)/N
I skipped over that part of the original description I see now that I reread it several times it sinks in. :)

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

추가 답변 (1개)

Geoff Hayes
Geoff Hayes 2017년 7월 7일
Andrew - what have you tried so far? Suppose mtx1 is your 600x600 matrix and mtx2 is your 6000x6000 matrix. The mapping of your elements from mtx1 to mtx2 is as follows
mtx1(1,1) --> mtx2(1:10,1:10)
mtx1(1,2) --> mtx2(1:10, 11:20)
mtx1(1,3) --> mtx2(1:10,21:30)
...
mtx1(2,1) --> mtx2(11:20,1:10)
...
mtx1(3,1) -->mtx2(21:30,1:10)
So one way to do this, is to iterate over each row and column of mtx1 and then map it to the correct "block" of mtx2 probably something like
mtx2((r-1)*10+1:r*10,(c-1)*10+1:c*10) = mtx1(u,v)/10;
where r and c are the indices to the current row and column respectively.

카테고리

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

Community Treasure Hunt

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

Start Hunting!

Translated by