簡體   English   中英

MATLAB按另一個矩陣中的索引進行索引

[英]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.

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