Как найти нечетные строки матрицы

It’s pretty easy to do with indexing:

Odd rows and odd columns

B = A(1:2:end, 1:2:end);

Odd rows and even columns

B = A(1:2:end, 2:2:end);

Even rows and odd columns

B = A(2:2:end, 1:2:end);

Even rows and even columns

B = A(2:2:end, 2:2:end);

The above assumes that you want the actual matrix values themselves. It’s a bit confusing as your matrix elements are the same as linear indexing values themselves. If you want to determine the actual column major indices to access the matrix, you can generate a vector from 1 to N where N is the total number of elements in your matrix, then reshape this matrix into the desired size that you want. After, use the same logic above to get the actual linear indices:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns
%// Repeat for the other ones...

Now, given your comment, you want to create a new matrix that will store only these extracted matrix values while making all of the other elements zero. If you want to do this, simply pre-allocate a matrix of zeroes, then copy over those values to extract using the computed indices into the new matrix. In other words:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns - Change to suit your tastes
out = zeros(size(A));
out(ind(:)) = A(ind(:));

If you want to combine the indices like having odd row – odd column, and even row – even column, just compute two sets of indices, concatenate them into a single vector and do the same syntax like before. Therefore:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns
ind2 = B(2:2:end, 2:2:end); %// For even rows, even columns
ind = [ind(:); ind2(:)];
out = zeros(size(A));
out(ind) = A(ind);

Белая и пушистая

22 / 22 / 1

Регистрация: 01.09.2009

Сообщений: 452

1

Найти нечетные элементы в матрице

01.11.2009, 10:05. Показов 2989. Ответов 13


Студворк — интернет-сервис помощи студентам

Подскажите плз, как найти нечетные элементы в двумерном массиве?



0



John_Pa9JIbHuK

Добрый самаритянин

1107 / 622 / 139

Регистрация: 31.03.2009

Сообщений: 2,567

01.11.2009, 10:22

2

Pascal
1
2
3
4
for i:=1 to... do
for j:=1 to... do
if a[i,j] mod 2 <>0 then
writeln('He4etHbIu');



1



Piratcom

21 / 21 / 3

Регистрация: 05.08.2009

Сообщений: 243

01.11.2009, 12:15

3

А если подсчитать то так

Delphi
1
2
3
4
5
6
7
8
9
var a: integer;
 
a=0;
for i:=1 to... do
for j:=1 to... do
if a[i,j] mod 2<>0 then 
begin
   Inc(a);
end;

В переменной “a” будет храниться число, количество нечётных элементов в массиве.



1



Suslichek

Белая и пушистая

22 / 22 / 1

Регистрация: 01.09.2009

Сообщений: 452

01.11.2009, 15:50

 [ТС]

4

if a[i,j] mod 2<>0 then
что-то он ругается на эту запись – operator not applicable to this operand type

Добавлено через 1 минуту
вот короче, только чур не ржать, я нуб в этом

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm2.Button1Click(Sender: TObject);
Var a:array of array of real;
    nech,n,m,i,j:integer;
    
begin
n:=StrToInt(InputBox('Ìàññèâ','Ââåäèòå êîë-âî ñòðîê','5'));
m:=StrToInt(InputBox('Ìàññèâ','Ââåäèòå êîë-âî ñòîëáöîâ','5'));
SetLength(a,n,m);
for i:=0 to n-1 do
 for j:=0 to m-1 do
 a[i,j]:=StrToFloat(InputBox('Ìàññèâ','Ââåäèòå ('+IntToStr(i+1)+','+IntToStr(j+1)+') ýëåìåíò','0'));
 nech:=0;
 if a[i,j] mod 2<>0 then nech:=nech+1;
Label5.Caption:=FloatToStr(nech);
 Finalize(a);
end;
 
end.



0



Почетный модератор

64285 / 47584 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

01.11.2009, 16:00

5

Suslichek, Ну зачем массив вещественных чисел, если ищем нечетные? Ведь нечетными бывают только целые числа. Напишите a:array of array of integer;



1



Monte-Cristo

2815 / 1406 / 107

Регистрация: 07.03.2009

Сообщений: 4,446

01.11.2009, 16:01

6

Suslichek,

1. nech надо сделать integer;
2. ты заполняешь массив… а потом, что за обращение a[i,j] ? У тебя же i и j не проходят по массиву.

попробуй так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm2.Button1Click(Sender: TObject);
Var a:array of array of real;
    n,m,i,j:integer;
    nech:real;
begin
n:=StrToInt(InputBox('Массив','Введите кол-во строк','5'));
m:=StrToInt(InputBox('Массив','Введите кол-во столбцов','5'));
SetLength(a,n,m);
 
for i:=0 to n-1 do
    for j:=0 to m-1 do
        a[i,j]:=StrToFloat(InputBox('Массив','Введите ('+IntToStr(i+1)+','+IntToStr(j+1)+') элемент','0'));
 
nech:=0;
 
for i:=0 to n-1 do
    for j:=0 to m-1 do
        if a[i,j] mod 2 <> 0 then nech:=nech+1;
 
Label5.Caption:=FloatToStr(nech);
Finalize(a);
end;



1



Белая и пушистая

22 / 22 / 1

Регистрация: 01.09.2009

Сообщений: 452

01.11.2009, 16:08

 [ТС]

7

ругается



0



15 / 15 / 0

Регистрация: 18.05.2009

Сообщений: 52

01.11.2009, 16:14

8

попробуй через StringGrid
насчёт Mod в Real …. мод это целочисленное деление, т.е. работать может не правильно
12.3451(вот это число он может посчитать как чётное)

думаю будет проще сделать, найти последнее число и если оно равно 0,2,4,6,8 – тогда число чётно ….



1



Suslichek

Белая и пушистая

22 / 22 / 1

Регистрация: 01.09.2009

Сообщений: 452

01.11.2009, 16:43

 [ТС]

9

и правда ругается на это
) только было бы проще, если бы я знала как это написать

Добавлено через 19 минут
По щелчку на кнопке в таблицу выводится двумерный массив и высчитывается кол-во нечетных элементов массива.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.FormCreate(Sender: TObject);
Var a:array of array of integer;
    nech,n,m,i,j:integer;
begin
n:=StrToInt(InputBox('Ìàññèâ','Ââåäèòå êîë-âî ñòðîê','5'));
m:=StrToInt(InputBox('Ìàññèâ','Ââåäèòå êîë-âî ñòîëáöîâ','5'));
SetLength(a,n,m);
for i:=0 to n-1 do
 for j:=0 to m-1 do
 begin
 a[i,j]:=StrToInt(InputBox('Ìàññèâ','Ââåäèòå ('+IntToStr(i+1)+','+IntToStr(j+1)+') ýëåìåíò','0'));
  StringGrid1.Cells[i,j]:=IntToStr(a[i,j]);
end;
nech:=0;
for i:=0 to n-1 do
 for j:=0 to m-1 do
 if a[i,j] mod 2 <>0 then
 Inc(nech);
 Label3.Caption:=InttoStr(nech);
Finalize(a);
end;
end.

Вроде решила может пригодиться кому-нить.



0



21 / 21 / 3

Регистрация: 05.08.2009

Сообщений: 243

01.11.2009, 16:46

10

Цитата
Сообщение от Suslichek
Посмотреть сообщение

nech:=nech+1;

Замени на Inc(nech); Тоже самое, только грамотней
Inc(nech) – увеличивает на 1 (инкримент)
Dec(nech) – уменьшает на 1 (декримент)



1



Белая и пушистая

22 / 22 / 1

Регистрация: 01.09.2009

Сообщений: 452

01.11.2009, 16:47

 [ТС]

11

типа круче будет?



0



21 / 21 / 3

Регистрация: 05.08.2009

Сообщений: 243

01.11.2009, 16:55

12

Точно , но строчку nech:=0 не убирайте, люди говорят что не всегда она при объявлении будет равна 0, иногда бывает, что в памяти, по адресу которой расположена переменная находится “мусор” и это может привести к неточности вычисления, поэтому лучше обнулить…



0



Белая и пушистая

22 / 22 / 1

Регистрация: 01.09.2009

Сообщений: 452

02.11.2009, 16:19

 [ТС]

13

а как лейбл очисть от предыдущих записей?!!!



0



Splitter

203 / 145 / 16

Регистрация: 13.01.2009

Сообщений: 554

02.11.2009, 16:50

14

А зачем вообще мучаться с mod? Есть замечательная функция Odd

Delphi
1
if Odd(a[i,j]) then inc(nech);

и вообще, я бы уменьшил весь код, зачем 2 раза по массиву пробегаться?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.FormCreate(Sender: TObject);
Var a:array of array of integer;
    nech,n,m,i,j:integer;
begin
n:=StrToInt(InputBox('Массив','Введите кол-во строк','5'));
m:=StrToInt(InputBox('Массив','Введите кол-во столбцов','5'));
SetLength(a,n,m);
nech:=0;
for i:=0 to n-1 do
 for j:=0 to m-1 do
 begin
 a[i,j]:=StrToInt(InputBox('Массив','Введите ('+IntToStr(i+1)+','+IntToStr(j+1)+') элемент','0'));
  StringGrid1.Cells[i,j]:=IntToStr(a[i,j]);
 if Odd(a[i,j]) then 
   begin
   Inc(nech);
   Label3.Caption:=InttoStr(nech);
   end;
end;
Finalize(a);
end;
end.

что-то такое…



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

02.11.2009, 16:50

14

Задание: Задать с клавиатуры целочисленную матрицу NxM. Найти в каждой нечетной
строке матрицы элемент с минимальным значением. Вывести на экран позиции и значения найденных элементов.

Вот код программы:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main () {
int n,m;
int mas2[4][4];

for (n = 1; n<4; n++)
        {
            for (m = 1; m<4; m++)
  {
        printf ("mas2[%d,%d] = ", n,m);
            scanf ("%d", &mas2[n] [m]); // Ввод массива
  }
        }
         for (n = 1; n<4; n++)
        {
            for (m = 1; m<4; m++)
        {
        printf ("%d ", mas2[n] [m]); // Вывод массива
        }
        printf ("n");
        }
         for (n = 1; n <4; n++)
        {
        for (m = 1; m <4; m++)
        {
            if ((n) % 2 != 0)
            {
            printf ("mas2[%d,%d] = %dn", n,m,mas2[n] [m]); // Вывод нечетных строк
            }
        }
    }
}

Вывод нечетных строк я организовал, не получается вывести позиции и значения элементов с минимальном значением в этих строчках.

Формулировка задачи:

__________________________________________________________________

как сделать чтоб он еще выводил нечетные строки и чётные столбцы ???
__________________________________________________________________

Код к задаче: «Вывести нечетные строки матрицы на печать»

textual

writeln;
i:=1;
Repeat {Нечетные строки}
  For j:=1 to M do write(a[i,j]:4);
  writeln;
  i:=i+2;
Until i>N;
 
j:=2;
Repeat {Четные столбцы}
  For i:=1 to N do write(a[i,j]:4);
  writeln;
  j:=j+2;
Until j>M;

Полезно ли:

15   голосов , оценка 4.133 из 5

У меня следующая проблема:

У меня есть заданная матрица, скажем, 4x4. Как получить индексы следующих комбинаций:

  • строка нечетная и столбец нечетная
  • строка нечетная и столбец четная
  • четная строка и нечетный столбец
  • четный ряд и четный столбец

Например, если у меня есть матрица:

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
  • ‘строка нечетная и столбец нечетная’ будут индексами 1, 3, 9, 11 …
  • ‘строка нечетная и столбец четная’ будут индексами 2, 4, 10, 12 …
  • ‘четная строка и нечетная колонка’ будут индексами 5, 7, 13, 15 …
  • а «четная строка и четный столбец» будут индексами 6, 8, 14, 16 …

Кроме того, можно ли комбинировать эти операции, например, Я получаю индексы для «нечетной строки и нечетного столбца» и «четной строки и четного столбца»?

Спасибо!

2 ответа

Лучший ответ

С индексацией сделать это довольно просто:

Нечетные строки и нечетные столбцы

B = A(1:2:end, 1:2:end);

Нечетные строки и четные столбцы

B = A(1:2:end, 2:2:end);

Четные строки и нечетные столбцы

B = A(2:2:end, 1:2:end);

Четные строки и даже столбцы

B = A(2:2:end, 2:2:end);

Вышеизложенное предполагает, что вам нужны сами фактические значения матрицы. Это немного сбивает с толку, поскольку элементы вашей матрицы такие же, как сами значения линейной индексации. Если вы хотите определить фактические основные индексы столбцов для доступа к матрице, вы можете сгенерировать вектор из 1 to N, где N – общее количество элементов в вашей матрице, а затем преобразовать эту матрицу в желаемый размер. что ты хочешь. После этого используйте ту же логику, что и выше, чтобы получить фактические линейные индексы:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns
%// Repeat for the other ones...

Теперь, учитывая ваш комментарий, вы хотите создать новую матрицу, которая будет хранить только эти извлеченные значения матрицы, при этом все остальные элементы будут нулевыми. Если вы хотите сделать это, просто заранее выделите матрицу нулей, а затем скопируйте эти значения, чтобы извлечь их с использованием вычисленных индексов в новую матрицу. Другими словами:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns - Change to suit your tastes
out = zeros(size(A));
out(ind(:)) = A(ind(:));

Если вы хотите объединить индексы, например, иметь нечетную строку – нечетный столбец и четную строку – четный столбец, просто вычислите два набора индексов, объедините их в один вектор и выполните тот же синтаксис, что и раньше. Следовательно:

N = numel(A);
B = reshape(1:N, size(A,1), size(A,2));
ind = B(1:2:end, 1:2:end); %// For odd rows, odd columns
ind2 = B(2:2:end, 2:2:end); %// For even rows, even columns
ind = [ind(:); ind2(:)];
out = zeros(size(A));
out(ind) = A(ind);


12

rayryeng
27 Окт 2014 в 18:41

Код

N = size(A,1); %// Get size of input matrix A

case1_ind = bsxfun(@plus,[1:2:N]',(0:N/2-1)*2*N)
case2_ind = case1_ind + N
case3_ind = case1_ind + 1
case4_ind = case3_ind + N

Примечание. Эти выходные данные являются индексами. Итак, чтобы получить фактические результаты, используйте их как индексы.

Чтобы объединить индексы для case 1 и case 4, просто объедините –

case14comb_ind = [case1_ind ; case4_ind]

Изменить:

%// To copy onto some other matrix of the same size as A, do this for case 1
new_matrix = zeros(size(A))
new_matrix(case1_ind(:)) = A(case1_ind(:))

Повторите это и для других случаев.


2

Divakar
27 Окт 2014 в 18:15

Добавить комментарий