【问题标题】:Convert digit to vector octave/matlab [duplicate]将数字转换为矢量八度/ matlab [重复]
【发布时间】:2014-08-03 17:42:50
【问题描述】:

我有一个矢量y = [0; 2; 4]

我想将它的每个元素转换成向量,其中所有元素都为零,但索引等于 digit 的元素为 1。

我想不使用循环。

例如[0; 2; 4]应该转换为

[1 0 0 0 0 0 0 0 0 0;
 0 0 1 0 0 0 0 0 0 0;
 0 0 0 0 1 0 0 0 0 0]

(在这个例子中,向量的第一个索引是 0)

【问题讨论】:

  • 为什么没有循环?这似乎是一个随机限制。
  • 输出矩阵的大小是怎么决定的?
  • @Jongware - for 循环在 MATLAB 中是出了名的慢。将其矢量化始终是建议的方法。但是,根据您正在执行的操作,for 循环可以在 JIT 编译器的帮助下与矢量化方法一样快,因为 MATLAB 本质上使用的是 JVM。如果您好奇,请查看这篇文章:stackoverflow.com/questions/23879888/…

标签: matlab matrix octave matrix-multiplication


【解决方案1】:

sparse 的常用技巧可用于简化流程。让n 表示所需的列数。那么

result = full(sparse(1:numel(y), y+1, 1, numel(y), n));

例如,y = [0;2;4]10 生产

result =
     1     0     0     0     0     0     0     0     0     0
     0     0     1     0     0     0     0     0     0     0
     0     0     0     0     1     0     0     0     0     0

【讨论】:

  • 我也是+1。 sparse 绝对是要走的路,尤其是在矩阵大小变大的情况下。
【解决方案2】:

首先,您需要决定多少位要代表每个数字。在您的情况下,每个数字都有 10 位数字,所以请记住这一点。

完成此操作后,只需为矩阵中的每个元素编制索引即可。在您的情况下,每个号码有 10 位数字。因此,请执行以下操作:

y = [0; 2; 4]; %// Your digits array
out = zeros(numel(y), 10); %// 10 digits per number
ind = sub2ind(size(out), [1:numel(y)].', y+1);
out(ind) = 1;

输出应如下所示:

out =

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

让我们慢慢看一下这段代码。 y 定义输出矩阵每行所需的数字。 out 分配一个零矩阵,其中行数由y 中所需的位数定义。 out 将因此存储您在帖子中向我们展示的结果矩阵。

列数为 10,但您可以将其更改为任何您想要的。 ind 使用一个名为 sub2ind 的命令。这允许在您的out 矩阵中完全矢量化值的分配,并避免for 循环。第一个参数是一个值数组,它定义了矩阵中有多少行和列是您尝试分配的内容。在这种情况下,它只是out 的大小。第二个和第三个参数是您要在矩阵中访问的行和列。在这种情况下,行从 1 到 y 中的元素数不等。在我们的例子中,这是 3。我们希望每行生成一个数字,这就是它从 1 变为 3 的原因。列表示我们希望将每行的数字设置为 1 的位置。由于 MATLAB 索引从 1 开始,我们必须确保我们采用 yadd by 1ind 因此创建列主要索引以访问我们的矩阵。最后一条语句最终访问这些位置并为每个位置分配 1,从而生成我们的矩阵。


希望这会有所帮助!

【讨论】:

  • +1 主要是详细解释
猜你喜欢
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多