Matlab:每隔n个间隔乘以选择的行

时间:2011-11-17 15:43:20

标签: matlab matrix multiplication

我有一个63row x 7列矩阵。

xmax=63;
ymax=7;

for i=1:xmax
    for j=1:ymax
        n=(i-1)*ymax+j;
        matrix(i,j)=n;

    end
end


    1     2     3     4     5     6     7
    8     9    10    11    12    13    14
   15    16    17    18    19    20    21
   22    23    24    25    26    27    28
   29    30    31    32    33    34    35
   36    37    38    39    40    41    42
   43    44    45    46    47    48    49
   50    51    52    53    54    55    56
   57    58    59    60    61    62    63
   64    65    66    67    68    69    70
   71    72    73    74    75    76    77
   78    79    80    81    82    83    84
   85    86    87    88    89    90    91
   92    93    94    95    96    97    98
   99   100   101   102   103   104   105
**106** 107   108   109   110   111 **112**
**113** 114   115   116   117   118 **119**
**120** 121   122   123   124   125 **126**
  127   128   129   130   131   132   133
  134   135   136   137   138   139   140
  141   142   143   144   145   146   147
  148   149   150   151   152   153   154
  155   156   157   158   159   160   161
  162   163   164   165   166   167   168
**169** 170   171   172   173   174 **175**
**176** 177   178   179   180   181 **182**
**183** 184   185   186   187   188 **189**
  190   191   192   193   194   195   196
  197   198   199   200   201   202   203
  204   205   206   207   208   209   210
  211   212   213   214   215   216   217
  218   219   220   221   222   223   224
  225   226   227   228   229   230   231
**232** 233   234   235   236   237 **238**
**239** 240   241   242   243   244 **245**
**246** 247   248   249   250   251 **252**
  253   254   255   256   257   258   259
  260   261   262   263   264   265   266
  267   268   269   270   271   272   273
  274   275   276   277   278   279   280
  281   282   283   284   285   286   287
  288   289   290   291   292   293   294
**295** 296   297   298   299   300 **301**
**302** 303   304   305   306   307 **308**
**309** 310   311   312   313   314 **315**
  316   317   318   319   320   321   322
  323   324   325   326   327   328   329
  330   331   332   333   334   335   336
  337   338   339   340   341   342   343
  344   345   346   347   348   349   350
  351   352   353   354   355   356   357
**358** 359   360   361   362   363 **364**
**365** 366   367   368   369   370 **371**
**372** 373   374   375   376   377 **378**
  379   380   381   382   383   384   385
  386   387   388   389   390   391   392
  393   394   395   396   397   398   399
  400   401   402   403   404   405   406
  407   408   409   410   411   412   413
  414   415   416   417   418   419   420
  421   422   423   424   425   426   427
  428   429   430   431   432   433   434
  435   436   437   438   439   440   441

我想更改周围有星号的值。

如果你以9组为单位倒数两列......它们是每列的每个(第7和第8和第9)组。

我希望能够使用这种代码格式或类似代码选择这些值:

maxi=63;
maxj=7;

for j=1:t
    for n=1:maxi
        for m=1:maxj
           if m==1  
          *insert code here*
           if m==maxj
          *insert code here......etc*

我不想选择第7个第8个第9个值,也不想选择最后3个值(所以我想忽略前9个分组和最后9个分组)。

我可以为每个条目手动执行此操作,但难点在于当我更改矩阵的大小时能够自动执行此操作。对于任何大小,代码应该在每个16,17,18和25,26,27等的第一列和最后一列向下运行..并且在最后三个条目(或最后一个9的分组)之前停止,同时跳过7,8,9th。

我最终会将带星号的单元格中的值乘以2,并用它替换相邻列的值。

所以

对于第1列,如果m == 1,则m + 1 = column1 * 2

第7列为

,如果m == maxj,则m-1 = column7 * 2

我知道mod允许使用倍数,但是当我更改矩阵大小时,我仍遇到同样的问题。

难以陈述的问题。请告诉我应该如何澄清它,非常感谢你的耐心和时间。

2 个答案:

答案 0 :(得分:2)

您可以使用以下选项自动调整“maxi”和“maxj”:

[maxi, maxj] = size(matrix);

然而,在Matlab中使用for循环通常会产生糟糕的性能,坦率地说,代码有点难看。我会尝试更多的东西:

period = 9;
matrix(16:period:end-period, 2) = 2 * matrix(16:period:end-period, 1);
matrix(17:period:end-period, 2) = 2 * matrix(17:period:end-period, 1);
matrix(18:period:end-period, 2) = 2 * matrix(18:period:end-period, 1);

请理解我没有仔细检查以上内容的正确性。特别是我会看看它是如何做或不做最后一组3。

答案 1 :(得分:1)

正如Jim Clay建议的那样,你不需要任何循环。

[m,n] = size(A);
k = 9;
idx = [16:k:m-k 17:k:m-k 18:k:m-k];
A(idx,2) = 2 * A(idx,1);

如果你想忽略更多的索引,比如[1 3 5],只需在乘法之前从idx删除它们:

idx = setdiff(idx, [1 3 5]);