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将向量转换为二进制矩阵[重复] 的相关文章

  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • const 和 constexpr 数组之间的区别

    为什么有区别const and constexpr当与数组一起使用时 int const xs 1 2 3 constexpr int ys 1 2 3 int as xs 0 error int bs ys 0 fine 我希望两者都能x
  • 是否允许将 std::vector 的元素插入到同一向量中?

    考虑以下insert and emplace的成员函数std vector
  • 通过引用传递向量

    如果我在一个类中有一个对象向量 我想在另一个类中更改它 我会尝试通过引用传递所有信息 我究竟需要通过引用传递什么 向量 物体 两个都 本质上我要问的是 它们之间有什么区别 vector blah A reference to a vecto
  • 将 Matlab 数组移植到 C/C++

    我正在将 matlab 程序移植到 C C 我有几个问题 但最重要的问题之一是 Matlab 将任何维度的数组都视为相同 假设我们有一个这样的函数 function result f A B C result A 2 B C A B and
  • 将 Excel 范围转换为 VBA 字符串

    我想将给定范围内的值转换为 VBA 字符串 其中原始单元格值由任何选定的列分隔符和行分隔符分隔 分隔符可以是一个字符或更长的字符串 行分隔符是行末尾的字符串 该字符串应该像我们从左上角 从左到右 到右下角读取文本一样完成 以下是范围 A1
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas
  • C++从文件中读取整数并保存到数组中

    我正在制作一个仅从文本文件读取整数的程序 我想创建一个读取整数并将它们存储在数组中的函数 以便稍后可以使用该数组通过冒泡排序对它们进行排序 这是我到目前为止所得到的 但我得到的输出是一些随机的 803234 数字 void read int
  • 我可以让这个 Ruby 代码更快并且/或使用更少的内存吗?

    我有一个Array of StringRuby 中的对象由如下单词组成 animals cat horse dog cat dog bird dog sheep chicken cow 我想将其转换为另一个Array of String对象
  • 使用 Java 进行 MongoDB 查询。计算数组中的匹配项

    我在 Mongo 中存储了类似于以下内容的数据 LIST NAME a VALUE z NAME b VALUE y NAME c VALUE x NAME d VALUE w NAME e VALUE v NAME f VALUE u N
  • 如何循环结构体数组并显示所有键值

    我正在循环结构数组并尝试分配和存储所有键值 如果我将内循环包裹起来
  • 如何将我的 json 字符串 avro 二进制编码为字节数组?

    我有一个实际的 JSON 字符串 我需要将其 avro 二进制编码为字节数组 在经历了Apache Avro 规范 http avro apache org docs 1 7 7 spec html 我想出了下面的代码 我不确定这是否是正确
  • 将数组字段组合成单个数组字段 mongo

    我正在使用 mongo 版本 3 4 3 我的文档存储在 mongo 中 如下所示 id ObjectId 5ad5ab8aaf2808b739ba6ab2 ResumeId 105839064 ResumeDetails WorkProf
  • 调整ArrayBuffer的大小

    如果我想创建一个数组缓冲区 我会写 var buff new ArrayBuffer size 但是如何调整现有缓冲区的大小呢 我的意思是 在缓冲区末尾添加更多字节 ArrayBuffer 本身没有设置 有set https develop
  • 在 RcppArmadillo 中将列向量乘以数值标量

    我在编译这个简单的程序时遇到一些麻烦c 代码使用Rcpp和RcppArmadillo包裹 采用以下简单示例 将矩阵的每一列乘以数值标量 code lt arma mat out Rcpp as
  • 需要从数组中删除字符串[重复]

    这个问题在这里已经有答案了 我在 for 循环中有一个数组 如下所示 var arr abc 5 city 2 area 2 max choice 我只需要这样的数字 var arr 5 2 2 有人可以在这里帮忙吗 另一种方法是使用转换后
  • 如何选择面积最大的对象?

    我用过bwconvhull检测图像的某个部分 正如您在图像中看到的那样 有许多具有特定质心的对象 我想做的是检测面积最大的物体 左起第一个大物体 并忽略其他物体 我应该遵循哪种方法 我将非常感谢您的帮助 以下是代码 由于我仍在努力 所以写得
  • 合并 2 个数组并合并数字键的结果

    我有 2 个数组 我希望通过每个数字键将其中合并 分组在一起 例如 Array1 2009 gt 131 2008 gt 940 2007 gt 176 2006 gt 1 Array2 2008 gt 9 2007 gt 3 我希望输出是
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • 朱莉娅在矩阵中查找(行,列)而不是索引

    在 Julia 中 您可以通过以下方式找到矩阵中元素的坐标 julia gt find x gt x 2 1 2 3 2 3 4 1 0 2 3 element Array Int64 1 2 4 9 这些值是正确的 但我更希望得到 row

随机推荐

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

    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 我不想使用循环 只想将其实现为简单的向量矩