我在Matlab中有一个大小为suppX
的矩阵GxN
和一个大小为A
的矩阵MxN
。如果行Xresponse
与行GxM
等于行Xresponse(g,m)=1
,则为A(m,:)
,如果矩阵suppX(g,:)
与行suppX=[1 2 3 4;
5 6 7 8;
9 10 11 12]; %GxN
A=[1 2 3 4;
1 2 3 4;
9 10 11 12;
1 2 3 4]; %MxN
Xresponse=[1 1 0 1;
0 0 0 0;
0 0 1 0]; %GxM
相等,则以Xresponsemy=zeros(size(suppX,1), size(A,1));
for x=1:size(suppX,1)
Xresponsemy(x,:)=ismember(A, suppX(x,:), 'rows').';
end
的大小构建矩阵import rarfile
rarfile.UNRAR_TOOL = "unrar.exe"
file = rarfile.RarFile("a.rar")
file.extractall()
。
让我用一个例子更好地解释。
rarfile.RarWarning: Non-fatal error [1]
我写了一个代码,可以完成我想要的。
$("#returnedProducts").append($("<option/>", function() {
var object = {
"srindex": i,
"data-details": JSON.stringify(result[i]._source.name.family),
"value": result[i]._source.category,
"html": result[i]._source.category,
};
if (result[i]._source.fabric) {
object["data-fabric"] = JSON.stringify(result[i]._source.fabric[1]);
}
return object;
)() ); // note that the function is called here
我的代码使用循环。我想避免这种情况,因为在我的实际情况下,这段代码是另一个大循环的一部分。您有没有循环的建议吗?
答案 0 :(得分:3)
一种方法是将每个矩阵视为N
维空间中的向量,您可以找到每个向量的L 2 范数(或欧几里得距离)。之后,检查距离是否为0。如果是,则您有一个匹配项。具体来说,您可以创建一个矩阵,使该矩阵中的元素(i,j)
计算一个矩阵中的行i
与另一矩阵中的行j
之间的距离。
您可以通过修改由此问题引起的距离矩阵来解决您的问题,例如1表示两个向量完全相似,否则0。
此帖子应引起关注:Efficiently compute pairwise squared Euclidean distance in Matlab。
我将专门研究Shai Bagon使用矩阵乘法和广播的答案。然后,您将对其进行修改,以便找到等于0的距离:
nA = sum(A.^2, 2); % norm of A's elements
nB = sum(suppX.^2, 2); % norm of B's elements
Xresponse = bsxfun(@plus, nB, nA.') - 2 * suppX * A.';
Xresponse = Xresponse == 0;
我们得到:
Xresponse =
3×4 logical array
1 1 0 1
0 0 0 0
0 0 1 0
由于在实现中使用的是ismember
,因此对我来说隐含的是,您期望所有值都是整数。在这种情况下,您可以直接与零距离进行比较,而不会降低精度。如果您打算移至浮点,则应该始终将某个较小的阈值(而不是0)进行比较,例如Xresponse = Xresponse <= 1e-10;
或类似的结果。我认为您的情况不需要这样做。
答案 1 :(得分:2)
这里是@rayryeng's answer的替代方法:使用带有'rows'
输入标志的unique
的第三个输出,将两个矩阵的每一行简化为唯一的标识符,然后将标识符与使用bsxfun
进行单例扩展(广播):
[~, ~, w] = unique([A; suppX], 'rows');
Xresponse = bsxfun(@eq, w(1:size(A,1)).', w(size(A,1)+1:end));