比较两个长度不等的向量得到逻辑数组

发布于 2024-12-15 02:31:12 字数 494 浏览 0 评论 0原文

我需要对以下代码进行向量化:

a = [1 2 3 2 3 1];
b = [1 2 3];

for i = 1:length(a)
    for j = 1:length(b)
        r(i, j) = (a(i) == b(j));
    end
end

输出 r 应该是一个逻辑数组:

 1     0     0
 0     1     0
 0     0     1
 0     1     0
 0     0     1
 1     0     0

我能得到的最接近的是:

for j = 1:length(b)
    r(:, j) = (a == b(j));
end

迭代较短的向量显然更有效,因为它生成的迭代次数更少。正确的解决方案应该没有任何 for 循环。

这在 MATLAB/Octave 中可能吗?

I need to vectorize the following code:

a = [1 2 3 2 3 1];
b = [1 2 3];

for i = 1:length(a)
    for j = 1:length(b)
        r(i, j) = (a(i) == b(j));
    end
end

The output r should be a logical array:

 1     0     0
 0     1     0
 0     0     1
 0     1     0
 0     0     1
 1     0     0

The closest I can get is:

for j = 1:length(b)
    r(:, j) = (a == b(j));
end

Iterating through the shorter vector is obviously more efficient as it generates fewer for iterations. The correct solution should have no for-loops whatsoever.

Is this possible in MATLAB/Octave?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暗地喜欢 2024-12-22 02:31:12

这是使用 bsxfun 的简单解决方案。

bsxfun(@eq,b,a')

ans =

     1     0     0
     0     1     0
     0     0     1
     0     1     0
     0     0     1
     1     0     0

Here's a simple solution using bsxfun.

bsxfun(@eq,b,a')

ans =

     1     0     0
     0     1     0
     0     0     1
     0     1     0
     0     0     1
     1     0     0
り繁华旳梦境 2024-12-22 02:31:12

bsxfun(@eq, a', b)

bsxfun(@eq, a', b)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文