[英]MATLAB indexing by indexes in another matrix
我正在嘗試根據存儲在另一個矩陣中的索引值生成一個新矩陣。
這對於 for 循環來說是微不足道的,但這是目前我正在嘗試優化的某些代碼中最慢的一行,所以我正在尋找一種沒有循環的方法,並將我的頭發拉出來。 我敢肯定這已經被回答過,而且我只是不知道正確的搜索詞。
n1 = 10;
n2 = 100;
a = randi(n2,[1,n1]);
b = randi(n2,[4,n1]);
c = rand(100,100);
for i = 1:n1
d(:,i) = c(a(i),b(:,i));
end
我假設您的代碼中n1
的值比您提供的示例中的值大得多,這可以解釋為什么它“慢”。
為了在沒有循環的情況下執行此操作,您可以使用 線性索引:
n1 = 1e6;
n2 = 100;
a = randi(n2,[1,n1]);
b = randi(n2,[4,n1]);
c = rand(n2,n2);
% With a loop
d = zeros(4,n1);
tic
for i = 1:n1
d(:,i) = c(a(i),b(:,i));
end
toc
% A faster way for big values of `n1`
d2 = zeros(4,n1);
tic
a_rep = repmat(a,4,1); % Repeat row indexes to match the elements in b
idx_Lin = sub2ind([n2,n2],a_rep(:),b(:)); % Get linear indexes
d2(:) = c(idx_Lin); % Fill
toc
isequal(d,d2)
經過的時間是 1.309654 秒。
經過的時間是 0.062549 秒。
答案=
合乎邏輯的
1
嘗試這個:
n1 = 10;
n2 = 100;
a = randi(n2,[1,n1]);
b = randi(n2,[4,n1]);
c = rand(100,100);
idx = (1:n1);
tic
d1=(c(a(idx),b(:,idx)))';
[idx,idy]=meshgrid(0:44:400,1:4);
d1=d1(idy+idx);
toc
這是時間:
Elapsed time is 0.000517 seconds.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.