我有兩個矩陣。一個大小爲1,000,000 x 9,另一個爲500,000 x 9.在matlab中合併兩個矩陣
這些列具有相同的含義,前7列具有鍵的功能。相應地,最後兩列有數據字符。在這兩個矩陣中有許多重疊的鍵值,我想有一個大矩陣來比較這些值。這個大矩陣應該是維百萬X 11
。例如:
A = [0 0 0 0 0 0 0 10 20; 0 0 0 0 0 0 1 30 40];
B = [0 0 0 0 0 0 0 50 60];
合併矩陣是這樣的:
C = [0 0 0 0 0 0 0 10 20 50 60; 0 0 0 0 0 0 1 30 40 0 0];
正如你可以看到,C的第一行矩陣A的列8,9和矩陣B的列10,11。第二行使用矩陣A的列8,9,最後的列使用0,0,因爲矩陣B中沒有對應的條目。
我理論上已經完成了這項任務,但它非常非常慢。我使用循環很多。在任何其他編程語言中,我將對兩個表進行排序,並在一個大循環中迭代兩個表,並保留兩個指針。
是否有更高效的算法可用於Matlab使用矢量化或至少是一個足夠有效的是慣用/短?
(附加說明:我最大的問題似乎是搜索功能:由於我的矩陣,我想在一個列向量7X1扔,讓我們將其命名爲key
找到相應的行現在,我使用。 bsxfun爲:
targetRow = data(min(bsxfun(@eq, data(:, 1:7), key), [], 2) == 1, :);
我用min
因爲bsxfun的結果是7個匹配標誌的載體,我當然希望所有的人是真實的在我看來,這可能是一個瓶頸Matlab算法)
語義上,我會總是喜歡'所有(X,2)''以上分鐘(X,[],2)== 1'用於邏輯陣列。不知道它是否更快。 – Florian
*「這可能是一個瓶頸」* - 你實際上可以檢查它是否是!嘗試使用'profiler'來顯示代碼的哪些行/部分使用最多的時間。 https://uk.mathworks.com/help/matlab/ref/profile.html即,'profile on;; profile viewer;' –
Wolfie