【问题标题】:loop to generate iterative rows of a matrix in mathematica循环以在mathematica中生成矩阵的迭代行
【发布时间】:2014-08-27 05:36:50
【问题描述】:

我有一个矩阵

FT= {{0, 0, 0}, {1, 1, 1}, {1, 1, 2}, {1, 1, 3}, {1, 2, 1}, {1, 2, 2}, {1,
   2, 3}, {1, 3, 1}, {1, 3, 2}, {1, 3, 3}, {2, 1, 1}, {2, 1, 2}, {2, 
  1, 3}, {2, 2, 1}, {2, 2, 2}, {2, 2, 3}, {2, 3, 1}, {2, 3, 2}, {2, 3,
   3}, {2, 4, 1}, {2, 4, 2}, {2, 4, 3}, {2, 5, 1}, {2, 5, 2}, {2, 5, 
  3}, {2, 6, 1}, {2, 6, 2}, {2, 6, 3}, {3, 1, 1}, {3, 1, 2}, {3, 1, 
  3}, {3, 2, 1}, {3, 2, 2}, {3, 2, 3}, {3, 3, 1}, {3, 3, 2}, {3, 3, 
  3}, {3, 4, 1}, {3, 4, 2}, {3, 4, 3}, {3, 5, 1}, {3, 5, 2}, {3, 5, 
  3}, {3, 6, 1}, {3, 6, 2}, {3, 6, 3}, {3, 7, 1}, {3, 7, 2}, {3, 7, 
  3}, {3, 8, 1}, {3, 8, 2}, {3, 8, 3}, {3, 9, 1}, {3, 9, 2}, {3, 9, 
  3}, {3, 10, 1}, {3, 10, 2}, {3, 10, 3}, {3, 11, 1}, {3, 11, 2}, {3, 
  11, 3}, {3, 12, 1}, {3, 12, 2}, {3, 12, 3}} 

其中每一行代表每个元素的一种地址,其第一个元素给出 G,第二个元素给出 B,第三个元素给出 M。例如对于第三个元素,G 为 1,B 为 1,M 为 2,依此类推。现在我需要为每个元素生成一个矩阵,这样每当我的 G 为 0 或 1 时,它都会给我 {0,0,0} 并且对于 G>1,它会给我 G-1、G-2 等行直到它给出 1;对于 B,它会检查 B 是否为偶数,它返回 B/2,每当 B 为奇数时,它返回 (B+1) /2 并且 M 每次都取值为 3,最后是一行 {0,0,0} .例如对于 FT= {3,12,3} 的最后一个元素,它应该给我 {{2,6,3}, {1,3,3}, {0,0,0}} 而对于 FT= {2,5,1} 它应该给我{{1,3,3}, {0,0,0}}。 你能帮我在mathematica中为此编写代码吗? 在此先感谢:)

【问题讨论】:

    标签: matrix wolfram-mathematica


    【解决方案1】:

    对于这个演示,小写符号用于避免与内置函数冲突,例如DEIN

    这个函数定义了基本操作

    op[{g_, b_, m_}] := {g - 1, If[EvenQ[b], b/2, (b + 1)/2], 3}
    

    应该重复应用,直到满足条件。 NestWhileList 对此很有用,例如

    NestWhileList[op[#] &, {3, 12, 3}, First[#] > 1 &]
    

    {{3, 12, 3}, {2, 6, 3}, {1, 3, 3}}

    另一个函数使用上面的 if g > 1 :-

    f[{g_, b_, m_}] := Append[
      If[g > 1, Rest@NestWhileList[op, {g, b, m}, First[#] > 1 &],
       {}], {0, 0, 0}]
    

    例如

    f[{2, 5, 1}]
    

    {{1, 3, 3}, {0, 0, 0}}

    现在f 可以映射到ft 上:-

    ft = {
       {0, 0, 0}, {1, 1, 1}, {1, 1, 2}, {1, 1, 3}, {1, 2, 1},
       {1, 2, 2}, {1, 2, 3}, {1, 3, 1}, {1, 3, 2}, {1, 3, 3},
       {2, 1, 1}, {2, 1, 2}, {2, 1, 3}, {2, 2, 1}, {2, 2, 2},
       {2, 2, 3}, {2, 3, 1}, {2, 3, 2}, {2, 3, 3}, {2, 4, 1},
       {2, 4, 2}, {2, 4, 3}, {2, 5, 1}, {2, 5, 2}, {2, 5, 3},
       {2, 6, 1}, {2, 6, 2}, {2, 6, 3}, {3, 1, 1}, {3, 1, 2},
       {3, 1, 3}, {3, 2, 1}, {3, 2, 2}, {3, 2, 3}, {3, 3, 1},
       {3, 3, 2}, {3, 3, 3}, {3, 4, 1}, {3, 4, 2}, {3, 4, 3},
       {3, 5, 1}, {3, 5, 2}, {3, 5, 3}, {3, 6, 1}, {3, 6, 2},
       {3, 6, 3}, {3, 7, 1}, {3, 7, 2}, {3, 7, 3}, {3, 8, 1},
       {3, 8, 2}, {3, 8, 3}, {3, 9, 1}, {3, 9, 2}, {3, 9, 3},
       {3, 10, 1}, {3, 10, 2}, {3, 10, 3}, {3, 11, 1}, {3, 11, 2},
       {3, 11, 3}, {3, 12, 1}, {3, 12, 2}, {3, 12, 3}};    
    
    matrix = Map[f, ft]
    

    【讨论】:

    • 感谢您的回答。现在我怎样才能得到'矩阵'的任何两个元素的交集。我的意思是现在我想要一个矩阵,让我有两个元素的交集。例如 matrix[[11]] 是 {{1, 1, 3}, {0, 0, 0}} 和 matrix[[30]] 是 {{2, 1, 3}, {1, 1, 3} , {0, 0, 0}}。所以他们的交集应该给我 {{1,1,3},{0,0,0}}。这我需要一个矩阵 inter[i_,j_],它给了我“矩阵”的 i 和 j 元素的交集。
    • inter[i_, j_] := Reverse[Intersection @@ matrix[[{i, j}]]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多