【问题标题】:Is it necessary to make a for loop to make matricies of ones based on a matrix of dimensions?是否有必要制作一个 for 循环来制作基于维度矩阵的矩阵?
【发布时间】:2015-10-16 19:21:17
【问题描述】:

我想在给定大小矩阵的情况下生成一组所有 1 个矩阵(在此示例中为 dimensions),但我一直很难让维度矩阵返回 ones 可以的大小向量一起工作。

我的第一直觉是:dimensions(:,:)

我把这个(错误地)读成return a matrix of size vectors [x,y]

但这似乎不起作用——有没有办法使用维度来生成大小向量矩阵?

我很想使用循环进行迭代,因为 i = 1 到 3 dimensions(i,:),但我想知道这是否是唯一的方法。

代码:

clear;

%3x2
dimensions = [32,40; %32x40 box of ones
          20, 30; %20x30 box of ones
          60, 10; %60x10 box of ones
          ];



Onesboxes = ones(dimensions(1,:));

%this works, but I really want OnesBoxes to be an array such that:

%OnesBoxes(1) = 32x40 box of ones
%OnesBoxes(2) = 20x30 box of ones
%OnesBoxes(3) = 60x10 box of ones

% if I try:
OnesBoxes = ones(dimensions); 

%Error using ones: Size vector should be a row vector with real elements.

%what I want to do is pass in sizes as rows in dimensions

%passing in the size of the ones array as a single vector works:
%onessize dimensions: 1x2
onessize = [4,2];

%tTestOnes dimensions: 4x2
tTestOnes = ones(onessize);

%making dimensions a 2x3 matrix instead doesn't seem to make a difference
%(I was thinking that maybe matlab thinks of matricies as an array of
%columns instead of arrays of rows?)
    %dimensions2 = [32,20,60; 40,30,10];

    %tOnesBoxes2 = ones(dimensions2);

编辑:输出:

输出

onessize = [4,2];

%tTestOnes dimensions: 4x2
tTestOnes = ones(onessize);

是一个全为 1 的 4x2 数组

输出

dimensions = [32,40; %32x40 box of ones
          20, 30; %20x30 box of ones
          60, 10; %60x10 box of ones
          ];

Onesboxes = ones(dimensions(1,:));

是一个 32x40 的数组

输出

dimensions = [32,40; %32x40 box of ones
              20, 30; %20x30 box of ones
              60, 10; %60x10 box of ones
              ];
OnesBoxes = ones(dimensions);

是个错误

错误使用一个大小向量应该是一个行向量与实 元素。

【问题讨论】:

  • 你能举一个输入输出准确的例子吗?
  • 添加了输出——抱歉,我不确定你所说的输入是什么意思,维度数组指定了这些数组的大小
  • Luis,我打算评论你的答案:这看起来像我正在寻找的东西,但你能解释为什么有必要通过 ones 单元格,而不是通过 @987654331 dimensions 中的 @ 行?似乎单元格具有更严格的分组,而 ones 之前可能误解了我的 3x2 dimensions 矩阵? FWIW 在我看来这是一个有用的答案,你为什么要删除它?
  • 我删除了它,因为在写完它之后,我看到另一个较早的答案非常相似(只有一个明确的 for 循环而不是 cellfun)。您需要传递定义矩阵大小的ones 向量。如果你想要几个矩阵,你需要多次调用ones。要收集所有生成的矩阵,您需要一个元胞数组,因为矩阵具有不同的大小。我的回答没有通过ones 单元格。它传递了向量。我使用单元格作为中间步骤来拆分输入并让蜜蜂能够使用cellfun。但这与 Praveen 的答案相同
  • If you want several matrices, you need to call ones several times 这就是我要找的东西——每次调用只能制作一个矩阵。 To collect all resulting matrices you need a cell array because the matrices have different sizes 还回答了我关于 : 限制的其他问题——如果你把它放在答案中,我会将其标记为已接受

标签: matlab


【解决方案1】:

如果你可以使用 for 循环,我能想到的最简单的方法是:

dimensions = [32,40; %32x40 box of ones
              20, 30; %20x30 box of ones
              60, 10; %60x10 box of ones
             ];
for i=1:size(dimensions,1)
    OnesBoxes{i}=ones(dimensions(i,:));
end

这将像你想要的那样创建OnesBoxes

OnesBoxes{1}% = 32x40 box of ones
OnesBoxes{2}% = 20x30 box of ones
OnesBoxes{3}% = 60x10 box of ones

【讨论】:

  • 您的代码有一个小错误,请注意%60x10 box of ones]; 导致右方括号被注释掉。除此之外,我喜欢将子矩阵放在单元格中的想法,尽管我仍然很好奇是否有办法只使用 : 运算符和dimensions
  • 糟糕!感谢您指出。修复。此外,将OnesBoxes(1) 更改为OnesBoxes{1} 等。选择适合您需要的。关于您单独使用 : 运算符的问题,我认为如果不通过 for 循环或 @LuisMendo 的答案中的 cellfun 进行迭代,您就无法做到这一点。
  • 谢谢,我对 Matlab 中 : 运算符的局限性感到有点困惑,我无法完全想象它的作用,我认为你是对的,它不能完成了,但我不确定为什么——我可能会在这个应用程序中再次遇到这个限制,如果有可能解释为什么这个数据结构设置不起作用,那真的对我有帮助出去。现在我唯一能想到的是“我混淆了 : 运算符”,因为它不知道制作矩阵矩阵。
  • This post 解释了有关 Matlab 中的冒号运算符的所有信息。它可能会帮助您清楚地了解Matlab中冒号运算符的用途和用法。简而言之,: 运算符用于数组索引。要创建矩阵矩阵,您需要的不仅仅是: 运算符。如前所述,要创建多个矩阵,您需要多次调用函数ones
【解决方案2】:

您需要传递ones 一个定义矩阵大小的向量。如果你想要几个矩阵,你需要多次调用ones。要收集所有生成的矩阵,您需要一个元胞数组,因为这些矩阵具有不同的大小。

您可以使用for 循环、arrayfuncellfun 来做到这一点。这里我使用的是后者:

dimensions = [ 2 3;
               4 5 ]; %// input data. Each row defines a matrix size
dimCell = mat2cell(dimensions, ones(1,size(dimensions,1)), size(dimensions,2));
    %// split each row into a cell, ready to be used as input for `cellfun`
result = cellfun(@(x) ones(x), dimCell, 'uniformoutput', false);

这给出了所需矩阵的元胞数组。在示例中,

>>  result
result = 
    [2x3 double]
    [4x5 double]
>> celldisp(result)
result{1} =
     1     1     1
     1     1     1
result{2} =
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多