【问题标题】:Matrix patterns矩阵模式
【发布时间】:2011-11-21 14:25:31
【问题描述】:

我有两个 9x9 矩阵,A 和 B。

我想用以下模式创建一个大矩阵 C

 A B B B B B
 B A B B B B
 B B A B B B
 B B B A B B
 B B B B A B
 B B B B B A

如您所见,A 矩阵在对角线上,B 在其他任何地方。我正在尝试创建一个代码,以便无论尺寸有多大,这种模式都会继续下去。

例如10 个矩阵 x 10 个矩阵仍然有矩阵 A 沿对角线和 B 的其他任何地方。

最好使用 horzcat 和 vertcat 或其他类似 blkdiag 的东西?我宁愿不将这些矩阵转换为单元格,因为矩阵 A 和 B 已经包含信息。

感谢大家花时间阅读。

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    怎么样(精炼)

    maskcell = repmat( {ones(size(A))}, 1, 10 );
    maskdiag = blkdiag( maskcell{:} );
    AA = repmat( {A}, 1, 10 );
    AD = blkdiag( AA{:} );
    BB = repmat( B, 10, 10 );
    C = BB .* (maskdiag == 0) + AD
    

    从下面完全有效的 cmets 开始,我添加了“掩码”以确保从 C 中选择正确的部分。

    【讨论】:

    • 现在测试:效果很好!谢谢。
    • 如果 A 包含0,这将有问题。
    • 我建议您将A 中的所有零设置为Inf, use Edric's code and set all the Inf` 回到0isinf
    • @Tetra:试试A = [1 2 ;3 0];B = [5 5;5 5] 的代码。你会看到对角线块不是A,而是[1 2;3 5]
    • 哦,我明白了!这确实是有问题的。我已经设法使这段代码随着时间的推移而工作,但重新定义矩阵可能是一个问题。感谢您的帮助!
    【解决方案2】:

    C=B(~eye(size(B)))+A(eye(size(A))) 应该可以满足您的需求。可能是结合使用眼睛的更快方法......

    【讨论】:

    • 感谢您抽出宝贵时间查看!一个有趣的答案,我会研究一下。
    【解决方案3】:

    克朗(眼(10),A)+克朗(~眼(10),B)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      相关资源
      最近更新 更多