【问题标题】:Storing multiple powers of matrices in matlab [duplicate]在matlab中存储矩阵的多个幂[重复]
【发布时间】:2015-03-18 01:01:48
【问题描述】:

我有 1000 个尺寸为 2x2 的矩阵。 我现在需要做的是获得这些矩阵的 30 个连续幂(A^2,A^3... ...A^30)并将它们全部存储。

我发现了一个建议使用 bsxfun 的主题: Vectorizing the creation of a matrix of successive powers 但是,bsxfun 不适用于元胞数组(“使用 bsxfun 时出错 操作数必须是数字数组”)。

我能做什么?
PS。第二个问题:一旦我有了它们,我想绘制 4 个图(每个对应于 2x2 矩阵的 1 个元素),其中 30 个位置(x 轴)将显示置信带(第 16 和第 84 个百分位)。

编辑:有人链接到一个与我链接的问题相似的问题。据我所知,问题是关于向量,而不是矩阵数组。

【问题讨论】:

  • 为什么将它们放在元胞数组中?
  • 将所有数据放在一个多维数组中是有意义的,然后bsxfun 通过 behind-the-scenes 扩展来处理其余部分,假设当然是数字数据。
  • 为什么不使用 for 循环?这是一个问题,您应该自然地重用A^k 来计算A^(k+1)
  • Ander:我不需要将它们放在元胞数组中,这正是我尝试使用 bsxfun 的方式。默认情况下,我将它们存储在 2x2x1000 矩阵中。 Divakar:那我应该如何实施呢?我不太擅长matlab,所以如果可能的话,我会很感激代码。 Knedlsepp:我想把它扩展到更高的数字,我不希望它永远持续下去。 PS。 IDK 为什么行不中断,我使用 2 个空格...抱歉格式化!
  • @JohnnyQ:不要低估 JIT 的力量! for 循环并不像您想象的那么慢。尤其是对于这些简单的操作。

标签: arrays matlab matrix


【解决方案1】:

假设您的数组A2-by-2-by-1000,这里有两个循环可以使事情正常工作:

A = rand(2,2,1000);
K = 30;
%%
N = size(A,3);
APower = zeros(2,2,N,K);
APower(:,:,:,1) = A;
for i = 1:N
    for k = 2:K
        APower(:,:,i,k) = A(:,:,i)*APower(:,:,i,k-1);
        %// Alternatively you could use: 
        %APower(:,:,i,k) = A(:,:,i)^k;
    end
end

【讨论】:

  • 我根本不懂你的外循环,或者你的索引。您的目标是从单个 2x2 矩阵创建 2x2x1000 矩阵,对吗?那么A(:,:,k) = A(:,:,k-1)*A(:,:,1)?
  • 没有。据我了解,OP 想要计算:对于 1000 个不同的 2-by-2 矩阵(逐层存储在 3D 数组中),矩阵为 k=1...30 提供 A^k 的幂。因此我假设输出应该是一个2-by-2-by-1000-by-30 数组。
  • 啊,我对 cme​​ts 的了解不够深入,所以问题不再符合所需的解决方案。
【解决方案2】:

您需要使用 cellfun 复制矩阵 30 次才能执行此操作。例如,

a = repmat(A{1},1,30);% Select one of your A matrices
b = num2cell(1:30);
x = cellfun(@(a,b) a^b,a,b,'UniformOutput',false)

由于您需要为 A 的每个元素运行 cellfun,另一种方法是使用 arrayfun,如下所示。

a = A{1};
b = 1:30;
x = arrayfun(@(b) a^b,b,'UniformOutput',false)

【讨论】:

  • 所以要使用你的最后一个想法,我必须创建一个循环?对不起,我不太擅长编程。
  • 我试图测试你的想法:for i = 1:1000 C{i} = rand(2); a = C{i}; b{i} = 1:30; x = arrayfun(@(b) a^b,b,'UniformOutput',false);结束
  • 我得到了错误:未定义函数 'mpower' 用于类型为“cell”的输入参数。 @(b)a^b 中的错误
  • 是的,需要一个循环。 cellfun 仅用于创建 30 次幂。但是应该可以使用 repmat 来复制您的矩阵并为您的所有数据使用类似的 cellfun。
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 2012-04-02
  • 2017-10-05
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
相关资源
最近更新 更多