(matlab矩阵运算),是否有可能从矩阵中得到一组没有循环的值?

时间:2016-08-22 08:52:15

标签: matlab matrix vectorization

我目前正致力于实现渐变检查功能,其中需要从结果矩阵中获取某些索引值。有人能告诉我如何从矩阵中获取一组值吗?

具体而言,对于大小为M x N的结果matrx res,I' ll需要得到元素res(3,1),res(4,2),res(1,3),res( 2,4)......

就我而言,M是维度,N是批量大小,并且标签数组的大小为1xbatch_size,[3 4 1 2 ...]。所以期望的值是res(label(:),1:batch_size)。因为我试图练习矢量化编程,所以最好不要使用循环。有人能告诉我如何在没有迭代的情况下获得一组价值吗?

干杯。

-------------------------- UPDATE -------------------- --------------------------

我发现的唯一想法是首先构建一个'掩码矩阵'然后使用原始结果矩阵进行元素乘法(技术上称为' Hadamard产品',see in wiki)。之后只需要输出非零元素并执行求和操作,matlab中的代码应如下所示:

温度=面膜* RES;

desired_res =温度(温度〜= 0); %注意:temp(temp~ = 0)在'列中提取非零元素'时尚:它逐列搜索临时矩阵,然后将非零数字放入容器' desired_res'。

在我的情况下,我接下来要做的只是sum(desired_res),所以我不需要考虑' desired_res'中的那些非零元素的顺序。

基于上述观点,创建掩模矩阵是关键目标。有两种方法可以完成这项工作。

代码如下所示。在我的情况下,使用accumarray函数添加' 1'在某个位置(存储在矩阵' subs'中)并添加' 0'到其他空间。这将为您提供一个掩码矩阵大小[rwo column]。 full(sparse())的用法类似。我对这两种方法做了一些比较(重复大约10次),结果完整(稀疏)更快,他们的时间成本幅度为10 ^ -4。如此小的差异,但在大规模的实验中,这很重要。使用accumarray的一个好处是它可以定义矩阵大小而full(稀疏())则不能。完整(稀疏(subs,1))将创建大小为[max(subs(:,1)),max(subs(:,2))]的矩阵。因为在我的情况下,这足以满足我的要求,我只知道它们的用法很少。如果您了解更多信息,请与我们分享。感谢。

这两个功能的详细说明可以在matlab的官方网站上找到。 accumarrayfullsparse

% assume we have a label vector
test_labels=ones(10000,1);
% method one, accumarray(subs,1,[row column])
tic
subs=zeros(10000,2);
subs(:,1)=test_labels;
subs(:,2)=1:10000;
k1=accumarray(subs,1,[10, 10000]);
t1=toc % to compare with method two to check which one is faster

%method two: full(sparse(),1)
tic
k2=full(sparse(test_labels,1:10000,1));
t2=toc

0 个答案:

没有答案