我想檢索兩個大型矩陣之間精確匹配(行特定)的索引。我有一個n×61的矩陣A,其中包含從0到9的值,另一個是n×61的矩陣B,而這裏的每行都包含0到9的值,但大多數是NaN(矩陣B的每一行中只有2到8列包含實際的數字)。矩陣A預計有150萬到300萬行,而矩陣B有大約0.2到50萬行。下面是設置的例子:兩個大型矩陣的Matlab比較
% create matrix a with random data
dataSample = [0 9];
numRows = 1000000;
numCols = 61;
A = randi(dataSample,numRows,numCols);
% create matrix B with random data
numRows = 100000;
numCols = 61;
numColsUse = 2:8;
dataRange = 0:9;
B = NaN(numRows,numCols);
for i = 1:size(B,1)
% randomly selet number of columns to fill
numColsFill = datasample(numColsUse,1);
% randomly select column index from available columns
colIdx = datasample([1:numCols],numColsFill);
% randomly select values from 0 to 9
numFill = datasample([0:9],numColsFill);
% insert numbers at respective column in matrix B
B(i,colIdx) = numFill;
end
我想矩陣A的每一行比較整個矩陣B,找到精確匹配,其中矩陣B匹配的數字矩陣A的數量在各自的位置(列) - 因此矩陣B中的NaN將被忽略。
我可以使用cellfun,其中I切片矩陣A在幾個子集,然後使用自定義函數來與每行中的矩陣B的子集的行比較,像這樣實現所需的結果:
% put all rows of matrix B in single cell
cellB = {B};
% take subset of matrix A and convert to cell array
subA = A(1000:5000,:);
subA = num2cell(subA,2);
% prepare cellB to meet cellfun conditions
cellB = repmat(cellB, [size(subA,1) 1]);
% apply cellfun to retrieve index of each exact match
idxContainer = cellfun(@findMatch, cellB, subA, 'UniformOutput', false);
功能findMatch如下所示:
function [ idx ] = LTableEval(cellB, subA)
idxCheckLT = lt(cellB, repmat(subA, [size(cellB,1) 1]));
idxCheckGT = gt(cellB, repmat(subA, [size(cellB,1) 1]));
idxCheck = idxCheckLT + idxCheckGT;
idxSum = sum(idxCheck,2);
idx = find(idxSum == 0);
end
這種方法的工作原理,但它似乎是非常低效的,尤其是RAM明智的,因爲cellfun要求所有輸入具有相同的大小,因此一個相同的數據的乘法集。關於如何以更高效的方式解決這個問題的任何想法?非常感謝!
矩陣減法? – ldgorman
'A-B == 0'?減法似乎是要走的方法是的 –
我同意,減法對實際比較有很大的意義,並且比我現在的方法好得多。然而,這並不能解決我的更基本的問題,我想找到一種有效的方法來減少B的每一行中的每一行。任何關於這方面的想法?謝謝! – Benvaulter