what can i do for this problem?

i want to use circshift on each 4096 blocks. each block has 8x8. what can i do?
example :
val(:,:,1) =
1.0e+003 *
1.5601 -0.0420 0.0307 -0.0164 -0.0116 -0.0204 -0.0001 -0.0001
-0.0117 0.0063 -0.0138 -0.0298 -0.0134 -0.0001 0.0009 0.0003
-0.0000 -0.0066 -0.0154 0.0001 -0.0002 -0.0007 0.0000 0.0001
0.0139 0.0092 0.0001 -0.0004 0.0006 0.0000 0.0001 -0.0002
0.0001 0.0003 0.0004 -0.0003 -0.0001 0.0005 -0.0000 0.0003
-0.0002 0.0001 0.0001 -0.0003 -0.0003 0.0003 0.0000 0.0001
-0.0004 -0.0003 -0.0002 -0.0002 -0.0001 -0.0004 -0.0001 0.0001
0.0001 -0.0004 -0.0000 0.0002 -0.0000 -0.0002 0.0002 0.0003
until
val(:,:,4096) =
888.0000 -17.6230 -5.2495 -0.4683 0 0.0909 -0.2610 -0.2792
18.2375 12.0902 -14.1269 -10.2305 -13.2117 -0.1457 -0.2282 0.0176
-6.8663 6.7403 8.3676 11.7774 -0.3663 0.1670 -0.3018 -0.3649
20.8197 -0.1267 -10.9207 0.2049 -0.1160 -0.0591 0.1562 -0.2024
0.2500 -0.2738 0 -0.2663 -0.2500 0.8486 0 0.0949
12.3305 -0.2777 -0.7394 -0.1323 -0.1247 -0.0385 0.4240 -0.1999
0.4087 0.2580 -0.0518 0.5184 0.4223 0.2034 -0.1176 0.2729
0.1247 0.4444 0.1992 -0.2810 0.2159 0.2496 -0.2789 -0.2565
thanks

 採用された回答

Azzi Abdelmalek
Azzi Abdelmalek 2013 年 7 月 27 日

0 投票

val=rand(8,8,4096); % Example
m=size(val,3);
a=arrayfun(@(x) circshift(val(:,:,x),-1),1:m,'un',0);
out=reshape(cell2mat(a),8,8,[]);

5 件のコメント

Tia
Tia 2013 年 7 月 27 日
it's great. but, i don't want to change position of matrix (1,1) for each block. what should i do? i write these codes, but it doesn't work properly.
...
out=reshape(cell2mat(a),8,8,[]);
out(8,1)=val(2,1);
out(1,1,:)=val(1,1);
thank for your kindness..it's very helpful
Azzi Abdelmalek
Azzi Abdelmalek 2013 年 7 月 27 日
編集済み: Azzi Abdelmalek 2013 年 7 月 27 日
It's not what is posted in your question. And now your question is not clear. Can you give a short example of a and what is the expected result? In your code there is a problem, you write out(8,1), then out(1,1,:) ?
Tia
Tia 2013 年 7 月 27 日
oh.. i got it. it works.thanks
Jan
Jan 2013 年 7 月 27 日
@Azzi: Again I suggest to avoid anonymous functions, here in arrayfun. See some timings in my answer.
Jan
Jan 2013 年 7 月 27 日
@Azzi: No idea why the first comment was there. I have some timing problems in the forum currently. Sometimes after I hit the Save butting, its title is saved to "Saving..." and nothing happens for a minute. Then it is set back to "Save" without any changes.
I've deleted the misplaced first comment.

サインインしてコメントする。

その他の回答 (1 件)

Jan
Jan 2013 年 7 月 27 日
編集済み: Jan 2013 年 7 月 27 日

1 投票

There is no need to encapsulate circshift in arrayfun:
val = rand(8,8,4096);
tic;
m = size(val,3);
a = arrayfun(@(x) circshift(val(:,:,x),-1),1:m,'un',0);
out = reshape(cell2mat(a),8,8,[]);
toc
% Elapsed time is 0.411869 seconds.
A simple loop is faster than ARRAYFUN:
tic;
out2 = zeros(size(val));
for k = 1:m
out2(:,:,k) = circshift(val(:,:,k), -1);
end
toc
% Elapsed time is 0.379831 seconds.
But circshift operate on 3D arrays directly also:
tic;
out3 = circshift(val, -1);
toc
% Elapsed time is 0.006587 seconds.
isequal(out, out2, out3)
% TRUE
This is 62 times faster (R2009a/64/Win7) and looks much easier.

カテゴリ

ヘルプ センター および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by