簡體   English   中英

Matlab:根據2D數組創建3D數組

[英]Matlab: creating 3D arrays as a function of 2D arrays

我想創建作為2d數組函數的3d數組,並在每個2D數組上應用矩陣運算。 現在,我正在使用for循環創建一系列2d數組,如下面的代碼所示:

for i=1:50
    F = [1 0 0; 0 i/10 0; 0 0 1]; 
    B=F*F';
end

沒有for循環,有沒有辦法做到這一點? 我嘗試了諸如:

F(2,2) = 0:0.1:5;

和:

f=1:0.1:5;
F=[1 0 0; 0 f 0; 0 0 1];

創建它們而沒有循環,但是兩者都會產生尺寸不一致的錯誤。

我還想在我的代碼中對F執行矩陣運算,例如

B=F*F';

並希望將F的某些分量作為其他函數的圖。 在這種情況下是否可以完全消除for循環?

如果我正確理解了您想要的內容,則需要將50個2D矩陣堆疊到3D矩陣中,其中中間項從1/1050/10 = 51/10步長變化。 您幾乎正確。 您需要做的是首先創建3D矩陣堆棧,然后將3D向量分配給中間條目。

這樣的事情會做:

N = 50;
F = repmat(eye(3,3), [1 1 N]);
F(2,2,:) = (1:N)/10; %// This is 1/10 to 5 in steps of 1/10... or 0.1:0.1:5

首先預分配矩陣F ,該矩陣F是所有切片的單位矩陣,然后將每個切片的中間行和中間列替換為i/10 ,其中i = 1, 2, ..., 50

因此,要獲得第i 切片,只需執行以下操作:

out = F(:,:,i);

次要音符

我注意到最終您要做的是3D矩陣的矩陣乘法。 該操作未在MATLAB中定義,也未在線性代數上下文中的任何地方定義。 如果要單獨乘以每個2D切片,最好使用for循環。 在這種情況下,不支持使用本機操作進行向量化。

要循環執行此操作,您需要對每個切片執行以下操作:

B = zeros(size(F)); 
for ii = 1 : size(B,3) 
    B(:,:,ii) = F(:,:,ii)*F(:,:,ii).'; 
end

...但是,在檢查矩陣的屬性時,唯一不同的是中間條目。 如果執行矩陣乘法,則每個切片的所有條目都將是相同的……除了中間的條目本身只是平方的。 您是否將一個切片與另一個切片的轉置相乘並不重要。 身份的轉置仍然是身份。

如果您的矩陣將是這樣,則可以對其自身執行按元素的乘法:

B = F.*F;

如果F除以上以外的其他值,則此功能將無效

創建矩陣很容易:

N = 50;
S    = cell(1,N);
S(:) = {eye(3,3)};
F        = cat(3, S{:});
F(2,2,:) = (1:N)/10;

另一種(更快的)方式是:

N = 50;
F        = zeros(3,3,N);
F(1,1,:) = 1;
F(2,2,:) = (1:N)/10;
F(3,3,:) = 1;

然后,您可以通過以下方式獲得第三個矩陣(例如):

F(:,:,3)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM