Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 矩阵按行非等分矢量化_Matlab_Performance_Vectorization_Document Classification - Fatal编程技术网

Matlab 矩阵按行非等分矢量化

Matlab 矩阵按行非等分矢量化,matlab,performance,vectorization,document-classification,Matlab,Performance,Vectorization,Document Classification,我有X#test这是一个大小为967874 X 3的矩阵,其中列是:doc#,wordID,wordCount,有7505个唯一的doc#(长度(唯一的(X#test(:,1))==length(Y#test)==7505)。矩阵行也已根据doc#的列进行排序 我还有一个likelihoods矩阵,大小为61188x20,其中行都是可能的wordid,列是不同的类(length(unique(Y_test))==20) 我试图得到的结果是一个大小为7505 x 20的矩阵,其中每一行表示不同的文

我有
X#test
这是一个大小为
967874 X 3
的矩阵,其中列是:
doc#,wordID,wordCount
,有7505个唯一的doc#(
长度(唯一的(X#test(:,1))==length(Y#test)==7505
)。矩阵行也已根据doc#的列进行排序

我还有一个
likelihoods
矩阵,大小为
61188x20
,其中行都是可能的wordid,列是不同的类(
length(unique(Y_test))==20

我试图得到的结果是一个大小为
7505 x 20
的矩阵,其中每一行表示不同的文档,并且对于每个类(列),包含似然矩阵行中与该文档的wordid对应的值的字数总和(试图想出更好的措辞…)

我的第一个想法是根据文档将2D矩阵重新排列为3D矩阵,但每个唯一文档的行数不相等。我还认为制作一个由7505个矩阵组成的单元数组不是一个好主意,但这可能是错误的

如果我只展示我的代码,它可能更具解释性,但速度较慢,因为它会遍历7505个文档中的每一个:

probabilities = zeros(length(Y_test),nClasses); % 7505 x 20
for n=1:length(Y_test) % 7505 iterations
    doc = X_test(X_test(:,1)==n,:);
    result = bsxfun(@times, doc(:,3), log(likelihoods(doc(:,2),:)));
    % result ends up size length(doc) x 20   
    probabilities(n,:) = sum(result);
end
在上下文中,这就是我使用概率矩阵的目的:

% MAP decision rule
probabilities = bsxfun(@plus, probabilities, logpriors'); % add priors
[~,predictions] = max(probabilities,[],2);
CCR = sum(predictions==Y_test)/length(Y_test); % correct classification rate
fprintf('Correct classification percentage: %0.2f%%\n\n', CCR*100);
编辑:因此我根据doc#将矩阵分割成一个单元格数组,但不知道如何同时将
bsxfun
应用于单元格中的所有数组

counts = histc(X_test(:,1),unique(X_test(:,1)));
testdocs = mat2cell(X_test,counts);

你分析过代码了吗?您可能要解决的瓶颈是
doc=…
,因为这需要对X_测试的所有元素进行7000次比较。一次传递就可以工作(一次生成您需要的所有doc{m}),稍后您只需在同一个循环中使用doc{m}。如果瓶颈在
result=…
,我认为你做不了多少。此代码仅对每个元素操作一次。您可以使用简单的
tic来分析。。。doc{m}=X_检验。。。;结束toc
,然后用
doc{m}
代替
doc
(省略
doc=…
行)。哦,哇,我一定是太累了,我刚刚用
testdocs{n}
替换了
doc
,它几乎立即计算了一切。谢谢;)