Matlab将向量转换为二进制矩阵[重复]

2023-12-11

我有一个大小为 (m,1) 的向量 v,其元素是从 1:n 中选取的整数。我想创建一个大小为 (m,n) 的矩阵 M,如果 v(i) = j,则其元素 M(i,j) 为 1,否则为 0。我不想使用循环,只想将其实现为简单的向量矩阵操作。

所以我首先想到,创建一个包含重复元素的矩阵

 M = v * ones(1,n) % this is a (m,n) matrix of repeated v

例如 v=[1,1,3,2]' m = 4 且 n = 3

M =
     1     1     1
     1     1     1
     3     3     3
     2     2     2

然后我需要创建一个大小为 (1,n) 的比较向量 c

c = 1:n
1 2 3

然后我需要进行一系列的逻辑比较

M(1,:)==c % this results in [1,0,0]
.
M(4,:)==c % this results in [0,1,0]

然而,我认为应该可以执行最后的步骤,以紧凑的矩阵表示法遍历每一行,但我很困惑,而且对索引的了解不够。 最终结果应该是

M =
     1     0     0
     1     0     0
     0     0     1
     0     1     0

一个非常简单的调用bsxfun会成功的:

>> n = 3;
>> v = [1,1,3,2].';
>> M = bsxfun(@eq, v, 1:n)

M =

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

代码的工作原理实际上非常简单。bsxfun就是所谓的Binary S英格尔顿EX平移函数。这样做的作用是,您提供两个任意大小的数组/矩阵,只要它们是可广播的。这意味着它们需要能够扩大尺寸,以使它们的尺寸相等。在这种情况下,v是您感兴趣的向量,并且是第一个参数 - 请注意它是转置的。第二个参数是一个从 1 到n。现在会发生的是列向量v gets 复制的 / expands对于尽可能多的值n并且第二个向量被复制了尽可能多的行v。然后我们做一个eq这两个数组之间的 / 等于运算符。该扩展矩阵实际上第一列中全为 1,第二列中全为 2,直到n。通过做一个eq在这两个矩阵之间,您实际上确定了哪些值v等于相应的列索引。


以下是详细的时间测试和每个功能的细分。我将每个实现放入一个单独的函数中,并且还让n=max(v)这样路易斯的第一个代码就能工作。我用了timeit为每个函数计时:

function timing_binary

n = 10000;
v = randi(1000,n,1);
m = numel(v);

    function luis_func()
    M1 = full(sparse(1:m,v,1));       
    end

    function luis_func2()
    %m = numel(v);
    %n = 3; %// or compute n automatically as n = max(v);
    M2 = zeros(m, n);
    M2((1:m).' + (v-1)*m) = 1;      
    end

    function ray_func()
    M3 = bsxfun(@eq, v, 1:n);
    end

    function op_func()
    M4= ones(1,m)'*[1:n] == v * ones(1,n);
    end

t1 = timeit(@luis_func);
t2 = timeit(@luis_func2);
t3 = timeit(@ray_func);
t4 = timeit(@op_func);

fprintf('Luis Mendo - Sparse: %f\n', t1);
fprintf('Luis Mendo - Indexing: %f\n', t2);
fprintf('rayryeng - bsxfun: %f\n', t3);
fprintf('OP: %f\n', t4);


end

该测试假设n = 10000和向量v是一个由从 1 到 1000 的随机分布整数组成的 10000 x 1 向量。顺便说一句,我必须修改 Luis 的第二个函数,以便索引能够工作,因为加法需要兼容维度的向量。

运行这段代码,我们得到:

>> timing_binary
Luis Mendo - Sparse: 0.015086
Luis Mendo - Indexing: 0.327993
rayryeng - bsxfun: 0.040672
OP: 0.841827

路易斯·门多的sparse代码获胜(如我所料),然后是bsxfun,然后是索引,然后是您建议的使用矩阵运算的方法。时间以秒为单位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab将向量转换为二进制矩阵[重复] 的相关文章

随机推荐

  • 如何矢量化寻找向量中最近的点

    BigList rand 20 3 LittleList rand 5 3 我想为大列表中的每一行找到小列表中 最接近 的行 如欧几里德范数所定义 即 k 3 维度中相应值之间的距离平方和 我可以看到如何使用两个循环来执行此操作 但似乎应该
  • 如何确定我刚刚在 Cucumber 的 AfterStep 挂钩中执行了哪一步?

    我正在编写一个要在AfterStep黄瓜的回调 https github com cucumber cucumber wiki Hooks step hooks 我怎样才能知道调用这个钩子之前执行了哪一步 使用gem cucumber 2
  • 使用 data.table 滞后面板数据

    我目前使用滞后面板数据data table通过以下方式 require data table x lt data table id 1 10 t rep 1 10 each 10 v 1 100 setkey x id t so that
  • 如何创建具有 1 GB 堆的可执行 jar 文件

    我创建了一个类 它提供一个包含系统性能的文本文件作为输出 我想将它作为可执行文件罐 但是当我运行 Jar 时 我想将堆增加到 1 GB 如果我们运行这个程序 我可以通过这样的运行来做到这一点 java Xms1200m Xmx1300m S
  • 使用 Clearcase 创建标签

    我想通过明确指定从任何地方创建标签VOB姓名 不幸的是 无论我如何指定我的VOB我总是收到此错误 cleartool mklbtype global nc MyVOBName MY LABEL NAME cleartool Error In
  • 将类型传递给方法?

    我需要一些帮助来指明正确的方向 我想创建一个可以处理不同类型的方法 我需要以某种方式传递这些类型并以某种方式使用它们 任何关于这方面的指导都会很棒 这是方法 其中 TypeINeedToPassIn 是 是的 你猜对了 我需要传入的类型 p
  • 访问相同BLE外设的iOS应用程序:如何区分?

    我必须遵循以下场景 我的应用程序请求并接收来自 BLE 外设 血糖仪 的数据 用户可能安装了另一个应用程序 来自另一个开发人员 该应用程序也与外围设备通信 我注意到我的应用程序收到了由其他应用程序发起的请求的特征通知 这导致我的应用程序接收
  • 从 mediawiki 中的电子邮件生成文章

    我想发送一封电子邮件到 mediawiki 可以获取的地址 并让 mediawiki 接收它并从中生成一个新页面作为起点 更复杂的东西 比如类别 可以稍后再做 我在网上搜索了一下 没有发现任何明显的东西 我以前没有针对 mediawiki
  • Flutter:列表数据更改时 getx 控制器未更新。我如何确保 GetX 控制器知道添加的每个列表?

    我只是在步进器中有一个表单 有两个字段 名称 和 电子邮件 添加 按钮工作正常 并按预期将姓名和电子邮件添加到列表中 当我单击 保存 时 将打印 JSON 数据以及列表中的所有可用数据 Name first language Email f
  • jquery 中的图像本机宽度

    使用 jQuery 我可以在单击时更改图像的 src thumb li img click function var newlinkimage this attr src newlinkimage newlinkimage substrin
  • 如何获取当前登录grails的用户的id?

    我想显示有关登录用户的信息 例如注册期间给出的详细信息等 如何做到这一点 作为 grails 的新手 请帮忙 我正在使用 Spring 安全插件 那么您可以使用 springSecurityService 来获取控制器中的一些用户信息 cl
  • Net Core 2.0 AmazonServiceException:无法找到凭据

    我有以下代码 public void ConfigureServices IServiceCollection services AWS Options var awsOptions Configuration GetAWSOptions
  • 重新映射 org-shiftmetaright | org-shiftmetaleft 到 [shift-select-meta]left-word | [shift-select-meta]右词]

    有人可以帮我重新映射一下手吗org shiftmetaright org shiftmetaleft to shift select meta left word shift select meta right word 目标是在组织模式下
  • 如何从表中随机选择唯一的行对?

    我有两个这样的表 CREATE TABLE people id INT NOT NULL PRIMARY KEY id CREATE TABLE pairs person a id INT person b id INT FOREIGN K
  • Rust 相当于 Try-Catch 语句吗?

    是否可以在 Rust 中一次处理多个不同的错误 而不是单独处理而不使用额外的函数 简而言之 Rust 中相当于 Try Catch 语句的是什么 一个相似的feature早在2016年就有人提出过 但我不知道结果如何 例如 做这样的事情 t
  • 访问同一 DataFrame 列中的先前值

    这是我的代码 a pd DataFrame 1 2 3 4 5 6 7 8 9 10 columns A B print a a C 1 or np nan or is there a way to avoid this b lambda
  • 如何从 UWP 中的 IBuffer 或字节数组创建 IDirect3DSurface

    我想用一些内容创建一个视频RenderTargetBitmap在 UWP 中 我这样做是通过使用MediaClips From RenderTargetBitmap我可以得到一个IBuffer或像素字节数组 创建一个MediaClip我需要
  • Swift Codable 重用在不同模型结构/类之间共享的键子集

    我想知道是否有一种可行的方法可以通过使用自定义解码器初始化程序和 或多个容器和编码键来跨多个模型共享公共属性 这是我想要映射到相应的可编码模型的 JSON 对象 JSON 对象 我想要映射到的属性Codable is sprites 正如你
  • Azure 云服务上的 Microsoft.Jet.OLEDB.4.0 错误

    我的要求是将excel文件上传到网站根目录上的文件夹 然后将该文件的数据读取到数据表中 这在我现有的托管提供商上运行良好 但现在我已经将我的网站上传到 Windows Azure 云服务上 移植到 Azure 云服务后 我在 Microso
  • Matlab将向量转换为二进制矩阵[重复]

    这个问题在这里已经有答案了 我有一个大小为 m 1 的向量 v 其元素是从 1 n 中选取的整数 我想创建一个大小为 m n 的矩阵 M 如果 v i j 则其元素 M i j 为 1 否则为 0 我不想使用循环 只想将其实现为简单的向量矩