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 |
|||
1 |
Piratcom 21 / 21 / 3 Регистрация: 05.08.2009 Сообщений: 243 |
||||
01.11.2009, 12:15 |
3 |
|||
А если подсчитать то так
В переменной “a” будет храниться число, количество нечётных элементов в массиве.
1 |
Suslichek Белая и пушистая 22 / 22 / 1 Регистрация: 01.09.2009 Сообщений: 452 |
||||
01.11.2009, 15:50 [ТС] |
4 |
|||
if a[i,j] mod 2<>0 then Добавлено через 1 минуту
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; попробуй так:
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 думаю будет проще сделать, найти последнее число и если оно равно 0,2,4,6,8 – тогда число чётно ….
1 |
Suslichek Белая и пушистая 22 / 22 / 1 Регистрация: 01.09.2009 Сообщений: 452 |
||||
01.11.2009, 16:43 [ТС] |
9 |
|||
и правда ругается на это Добавлено через 19 минут
Вроде решила может пригодиться кому-нить.
0 |
21 / 21 / 3 Регистрация: 05.08.2009 Сообщений: 243 |
|
01.11.2009, 16:46 |
10 |
nech:=nech+1; Замени на Inc(nech); Тоже самое, только грамотней
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
и вообще, я бы уменьшил весь код, зачем 2 раза по массиву пробегаться?
что-то такое…
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