[問題]三維矩陣對二維矩陣的擬合

看板MATLAB作者 (維克)時間9年前 (2015/09/08 16:28), 9年前編輯推噓6(6023)
留言29則, 4人參與, 最新討論串1/3 (看更多)
大家好,我是初入matlab世界的新手 有個問題想要請教各位 我現在有一個 128 X 128 X 20 的三維 A 矩陣, 以及一個 6 X 20 的二維 B 矩陣, 想要由這兩個矩陣求出三維 D 矩陣, 其式為 A = B X D。 目前嘗試取出 A 矩陣的一條 Z 方向轉換為 A1 = 20 X 1 的矩陣後, 用D=B\A, 可以求出 6 X 1 的矩陣 http://imgur.com/VIVjA27
然而,卻無法直接計算三維矩陣 (error : Input arguments must be 2-D.) 與二維的差別是,A與D矩陣,每個單一值變成128X128的矩陣 想請問要如何解出三維 D 矩陣 http://imgur.com/NTAb6Ln
A矩陣應該要如何進行轉換,或是是否有直接計算的語法 謝謝各位了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.249.251.232 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1441700906.A.D97.html

09/08 16:30, , 1F
用 for loop?
09/08 16:30, 1F

09/08 17:06, , 2F
A = B X D???? A:128x128x20, B:6x20 那D的維度?
09/08 17:06, 2F

09/08 17:07, , 3F
如果你是說B是6x20 D是6x6x20的話...
09/08 17:07, 3F
D將會是三維 128 x 128 x 6 這個問題簡單的說,就是把原本的2維矩陣能做的運算,擴充到3維 ※ 編輯: victor6954 (60.249.249.211), 09/08/2015 17:24:54 ※ 編輯: victor6954 (60.249.249.211), 09/08/2015 17:44:46

09/08 17:46, , 4F
我大概懂了,你是20個二維決戰做線性組合變成6個二
09/08 17:46, 4F

09/08 17:46, , 5F
維...
09/08 17:46, 5F

09/08 18:01, , 6F
D=zeros(size(A, 1), size(A, 2), 6);
09/08 18:01, 6F

09/08 18:01, , 7F
for i=1:6, D(:, :, i)=sum(cellfun@(x, y) x*y, m
09/08 18:01, 7F

09/08 18:01, , 8F
at2cell(A, size(A, 1), size(A, 2), ones(1, size(
09/08 18:01, 8F

09/08 18:01, , 9F
A, 3)), num2cell(B(i, :))), 3), end
09/08 18:01, 9F

09/08 18:02, , 10F
還沒試過,大概長這樣...
09/08 18:02, 10F

09/08 18:04, , 11F
這樣的話,我的式子好像變成BA=D.....
09/08 18:04, 11F

09/08 18:09, , 12F
請先忽略上面的式子QQ
09/08 18:09, 12F

09/08 21:22, , 13F
這種無解 乖乖用for loop吧
09/08 21:22, 13F

09/08 21:37, , 14F
gpu有pagefun 不過一般矩陣不能用....
09/08 21:37, 14F

09/08 21:37, , 15F
等MATLAB allow pagefun接受一般矩陣...
09/08 21:37, 15F

09/08 21:38, , 16F
這個case就可以一行了
09/08 21:38, 16F

09/10 02:43, , 17F
試看看這個
09/10 02:43, 17F

09/10 02:44, , 18F
A_ = reshape(A, [128 * 128, 20])';
09/10 02:44, 18F

09/10 02:44, , 19F
D = reshape(B \ A_, [6, 128, 128])';
09/10 02:44, 19F

09/10 02:50, , 20F
阿不對,應該要這樣
09/10 02:50, 20F

09/10 02:51, , 21F
A_ = reshape(A, [128^2, 20])';
09/10 02:51, 21F

09/10 02:51, , 22F
D_ = B \ A_;
09/10 02:51, 22F

09/10 02:51, , 23F
D = reshape(D_', [128, 128, 6]);
09/10 02:51, 23F

09/10 02:53, , 24F
這樣應該會跟for loop的結果一樣,但是速度快很多
09/10 02:53, 24F

09/10 14:16, , 25F
我比較了celestialgod的方法 速度大約是他第一個方法
09/10 14:16, 25F

09/10 14:16, , 26F
的兩倍,是他第二個方法的四倍
09/10 14:16, 26F

09/10 15:03, , 28F
樓上的方法應該跟底下那篇s大的方法差不多
09/10 15:03, 28F

09/11 00:32, , 29F
嗯的確是
09/11 00:32, 29F
文章代碼(AID): #1LxfmgsN (MATLAB)
文章代碼(AID): #1LxfmgsN (MATLAB)