Matlab: умножение выбранных строк на каждый n-й интервал - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть матрица размером 63 строки 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*

Я не хотел бы выбирать ни первое седьмое, ни восьмое, ни девятое значения, ни последние 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

Мне известно, что модпозволяет использовать кратные, но я все еще сталкиваюсь с теми же проблемами, когда я изменяю размер матрицы.

Трудная задача, чтобы заявить.Пожалуйста, скажите мне, как я должен уточнить это, и большое спасибо за ваше терпение и время.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Вы можете автоматически настроить ваши "макси" и "maxj" следующим образом:

[maxi, maxj] = size(matrix);

Однако использование циклов for в Matlab обычно дает плохую производительность, и, честно говоря, код немного уродлив. Я бы попытался пойти с чем-то более похожим на:

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 голос
/ 17 ноября 2011

Как предполагает Джим Клэй, для этого вам не нужны петли.

[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]);
...