Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15

Поиск в матрице ненулевых элементов по строкам и столбцам

10.08.2012, 08:59. Показов 7294. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте помогите решить задачку. Есть квадратная матрица >> N=[1 0 0 0 0 0; 0 -1 0 0 1 0; 0 0 -1 0 0 0; 0 0 0 -1 0 0; 0 0 0 0 -1 1; -1 0 0 0 0 -1]

N =

1 0 0 0 0 0
0 -1 0 0 1 0
0 0 -1 0 0 0
0 0 0 -1 0 0
0 0 0 0 -1 1
-1 0 0 0 0 -1
надо начиная с [1 1] элемента начать производить поиск ненулевого элемента сначала в столбце 1 такой элемент находится на позиции [1 6]=-1 дальше ищем по строке №6 это элемент [6 6]=-1 дальше по столбцу №6 это [6 5]=1 и далее таким же образом осуществляем поиск пока программа в 3 столбце не найдет ненулевой элемент это решение задачи Вопрос как организовать такой поиск с учетом того что содержание и размерность матриц может быть разная. Входные данные: заполненная матрица. Выходные данные: некая С [1 6]=-1 С [6 6]=-1 С [6 5]=1 С [5 5]=-1 С [5 2]=1 С [2 2]=-1 конец Заранее благодарю
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.08.2012, 08:59
Ответы с готовыми решениями:

Как вместо поиска по строкам сделать поиск по столбцам в матрице?
всем доброго времени суток. У меня такой вопрос, вот есть задача: Для каждой строки подсчитать количество положительных элементов и...

Среднее арифметическое в матрице по строкам/столбцам
Необходимо посчитать и вывести (можно в этом массиве отдельным столбцом, можно отдельным вектором) среднее арифметическое с m1 по m2...

Поиск по всем строкам и столбцам в DGV
Помогите пожалуйста сделать поиск по всему datagridview, тот код, что у меня есть, только ищет по первому столбцу: ...

18
3 / 3 / 0
Регистрация: 05.05.2012
Сообщений: 20
10.08.2012, 09:09
пусть матрица имеет размер m на n.
тогда просто
for i:=1 to m do
for j:=1 to n do
if a[i,j]<>0 then writeln(i," ",j," ",a[i,j]);

a это сама матрица. все вроде.
0
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 09:11  [ТС]
XelMed, спасибо а как это реализовать в Матлабе
0
3 / 3 / 0
Регистрация: 05.05.2012
Сообщений: 20
10.08.2012, 09:13
ну смысл тот же обсолютно. просто синтаксис матлаба чуть чуть отличаться будет. я честно говоря уже давно не писал в нем ничего не вспомню(
0
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 09:15  [ТС]
XelMed, по сути данная матрица содержит в себе дерево В выводе программы должны выдаваться элементы которые отыскиваются с начало в столбце а потом в строке и как только путь притвется значит задача решена. Те не все ненулевые элементы должны отразиться.
0
 Аватар для Shoomath
3 / 3 / 0
Регистрация: 14.05.2012
Сообщений: 33
10.08.2012, 12:10
Если я правильно понял постановку задачи, то нужно организовать ломаную, соединяющую в матрице по строкам или столбцам ненулевые элементы? И в конце вывести их в виде массива?
0
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 12:20  [ТС]
Shoomath, да помогите пожалуйста реализовать в матлабе
0
 Аватар для Shoomath
3 / 3 / 0
Регистрация: 14.05.2012
Сообщений: 33
10.08.2012, 13:19
Matlab M
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
clear all
 
N=[1 0 0 0 0 0;
   0 -1 0 0 1 0;
   0 0 -1 0 0 0;
   0 0 0 -1 0 0;
   0 0 0 0 -1 1;
  -1 0 0 0 0 -1],
 
C=zeros(size(N,1),size(N,2));
 
flag=1;
 
mt=1; %начальная строка
nt=1; %начальный столбец
C(mt,nt)=N(mt,nt);
N(mt,nt)=0;
 
while(flag~=3)
    if (flag==1) %поиск по столбцу
        for ii=1:size(N,1)
            if (N(ii,nt)~=0)  
                mt=ii;                 
                C(mt,nt)=N(mt,nt);
                N(mt,nt)=0;
                flag=1;
                break;
            elseif (ii==size(N,1)) 
                flag=2;
            end
        end
    end    
    if (flag==2) %поиск по строке
        for jj=1:size(N,2)
            if (N(mt,jj)~=0)
                nt=jj;
                C(mt,nt)=N(mt,nt);
                N(mt,nt)=0;
                flag=1;
                break;
            elseif (jj==size(N,2))
                flag=3; %конец
            end
        end
    end  
end
C=C,
0
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 13:28  [ТС]
Shoomath, а код до конца ? 47 строка не совсем понятна
0
 Аватар для Shoomath
3 / 3 / 0
Регистрация: 14.05.2012
Сообщений: 33
10.08.2012, 13:43
Цитата Сообщение от Лена bleksen Посмотреть сообщение
Shoomath, а код до конца ? 47 строка не совсем понятна
Это для вывода матрицы C в окне компилятора, можете удалить.
Главное, программа работает правильно?
0
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 13:45  [ТС]
Shoomath, в результате работы программы вывелась исходная матрица а надо вывести путь С [1 6]=-1 С [6 6]=-1 С [6 5]=1 С [5 5]=-1 С [5 2]=1 С [2 2]=-1
0
 Аватар для Shoomath
3 / 3 / 0
Регистрация: 14.05.2012
Сообщений: 33
10.08.2012, 14:03
Цитата Сообщение от Лена bleksen Посмотреть сообщение
Shoomath, в результате работы программы вывелась исходная матрица а надо вывести путь С [1 6]=-1 С [6 6]=-1 С [6 5]=1 С [5 5]=-1 С [5 2]=1 С [2 2]=-1
Если вы внимательно посмотрите, там не зря выводятся исходная (матрица N) и конечная (матрица C) матрицы, и написанные вами соотношения, как раз верны для конечной матрицы C. Нужно только изменить вывод...
0
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 14:09  [ТС]
Shoomath, после того как ввела C=C, матрица с отразилась программа работает правильно а каким образов изменить вывод? Спасибо за помощь.
0
 Аватар для Shoomath
3 / 3 / 0
Регистрация: 14.05.2012
Сообщений: 33
10.08.2012, 17:13
Matlab M
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
clear all
 
N=[1 0 0 0 0 0;
   0 -1 0 0 1 0;
   0 0 -1 0 0 0;
   0 0 0 -1 0 0;
   0 0 0 0 -1 1;
  -1 0 0 0 0 -1],
 
C=zeros(size(N,1),size(N,2));
 
flag=1;
 
mt=1; %начальная строка
nt=1; %начальный столбец
C(mt,nt)=N(mt,nt);
fprintf(1,'C(%d,%d)=%f\n',mt,nt,C(mt,nt));
N(mt,nt)=0;
 
while(flag~=3)
    if (flag==1) %поиск по столбцу
        for ii=1:size(N,1)
            if (N(ii,nt)~=0)  
                mt=ii;                 
                C(mt,nt)=N(mt,nt);
                fprintf(1,'C(%d,%d)=%f\n',mt,nt,C(mt,nt));
                N(mt,nt)=0;
                flag=1;
                break;
            elseif (ii==size(N,1)) 
                flag=2;
            end
        end
    end    
    if (flag==2) %поиск по строке
        for jj=1:size(N,2)
            if (N(mt,jj)~=0)
                nt=jj;
                C(mt,nt)=N(mt,nt);
                fprintf(1,'C(%d,%d)=%f\n',mt,nt,C(mt,nt));
                N(mt,nt)=0;
                flag=1;
                break;
            elseif (jj==size(N,2))
                flag=3; %конец
            end
        end
    end  
end
Да! Можно полюбопытствовать, зачем вам эта программа?
1
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 19:47  [ТС]
Shoomath в результате выполнения данного кода опять вышла квадратная матрица, а не координаты пути те всех ненулевых элементов в порядке следования-поиска. Данная задача это всего лишь маленький модуль одной большой задачи. Реализовать вдругой среде для меня было бы проще но надо на матлабе, а я им не занималась вообще никогда по этому и ищу хороших людей себе в помощ.)))
0
 Аватар для Shoomath
3 / 3 / 0
Регистрация: 14.05.2012
Сообщений: 33
10.08.2012, 20:06
Цитата Сообщение от Лена bleksen Посмотреть сообщение
Shoomath в результате выполнения данного кода опять вышла квадратная матрица, а не координаты пути те всех ненулевых элементов в порядке следования-поиска. Данная задача это всего лишь маленький модуль одной большой задачи. Реализовать вдругой среде для меня было бы проще но надо на матлабе, а я им не занималась вообще никогда по этому и ищу хороших людей себе в помощ.)))
Вы уверены, что ту программу запускали и смотрите в окно компилятора? Выдает ли компилятор ошибки с упоминанием fprintf? Какой версии у вас Matlab?

Вот, что выводит у меня в Matlab 7.9.0 (R2009b):
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
N =
 
     1     0     0     0     0     0
     0    -1     0     0     1     0
     0     0    -1     0     0     0
     0     0     0    -1     0     0
     0     0     0     0    -1     1
    -1     0     0     0     0    -1
 
C(1,1)=1.000000
C(6,1)=-1.000000
C(6,6)=-1.000000
C(5,6)=1.000000
C(5,5)=-1.000000
C(2,5)=1.000000
C(2,2)=-1.000000
Так же в любой другой версии должно быть, потому что никаких специальных функций я не использовал...

P.S.: Если это часть чего-то бОльшего, то зачем такие сложности с выводом, и необходимость вывода именно на экран?! Вам проще всего будет записать результаты в файл (лучший вариант) или создать функцию, если остальную часть тоже в Matlab'e писать будете...
1
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 20:46  [ТС]
Shoomath, Спасибо Вам большое. Вы просто гений. Разрешите мне еще немгого уж извените за наглость. Спасибо заранее. Представим что у нас есть некое дерево 5 11 10 9 6 7 которое задается вместе с N в самом начале. Этот ответ который нам выдала программа
C(1,1)=1.000000
C(6,1)=-1.000000
C(6,6)=-1.000000
C(5,6)=1.000000
C(5,5)=-1.000000
C(2,5)=1.000000
C(2,2)=-1.000000 надо представить в следующем виде( причем вектор этот всегда может иметь разные значения)
C(0,1)=1.000000
C(5,1)=-1.000000
C(11,1)=-1.000000
C(10,1)=1.000000
C(9,1)=-1.000000
C(6,1)=1.000000
C(7,1)=-1.000000 ну первый столбец понянто что соответствует вектору а второй первой строке с которой мы начинали поиск. Далее надо начать поиск со второй строки аналогичным способом т.е. искомый элемент с которого мы начинаем искать в N это 2,2=-1 и все больше нет ненулевых элементов по этому ответ будет С(11,2)=-1 далее смотрим 3 строку начинаем с элемента 3,3 ответом будет С(10,3)=0 для 4 строки ответ С(9,4)=0 далее С(6,5)=0 и с7,6=1 и все на этом вся задача больше ничего не надо будет. Я вас наверно уже замучила), простите но я без Вас никак.
0
4 / 4 / 1
Регистрация: 13.02.2010
Сообщений: 15
10.08.2012, 21:01  [ТС]
Shoomath, те для каждой строки с которой мы начинаем поиск смотрим по столбцу если нет там ненулевого элемента значит конец решение задачи найдено и выводим просто значение элемента с которого начинали а если есть то ищем пока в столбце будут тока одни нули. В п редыдущем сообщении я писала что ответом будет 0 С(10,3)=0 на самом деле -1 я имела в виду что все нет решения в столбце одни 0-ли, те в ответ программы надо вставить для них не 0 а -1. Спасибо. Во вложении график который представлен в матрице - это так просто вдруг понадобится.) мы всегда идем к базе к 6 узлу на графике от первого и через определенные ветви. Вот такая задачка. Никогда такое сама не делала. Огромнейщее вам спасибо мой списитель.
Вложения
Тип файла: zip 123.zip (73.4 Кб, 10 просмотров)
0
 Аватар для Shoomath
3 / 3 / 0
Регистрация: 14.05.2012
Сообщений: 33
15.08.2012, 17:41
Цитата Сообщение от Лена bleksen Посмотреть сообщение
Shoomath, Спасибо Вам большое. Вы просто гений. Разрешите мне еще немгого уж извените за наглость. Спасибо заранее. Представим что у нас есть некое дерево 5 11 10 9 6 7 которое задается вместе с N в самом начале. Этот ответ который нам выдала программа
C(1,1)=1.000000
C(6,1)=-1.000000
C(6,6)=-1.000000
C(5,6)=1.000000
C(5,5)=-1.000000
C(2,5)=1.000000
C(2,2)=-1.000000 надо представить в следующем виде( причем вектор этот всегда может иметь разные значения)
C(0,1)=1.000000
C(5,1)=-1.000000
C(11,1)=-1.000000
C(10,1)=1.000000
C(9,1)=-1.000000
C(6,1)=1.000000
C(7,1)=-1.000000 ну первый столбец понянто что соответствует вектору а второй первой строке с которой мы начинали поиск. Далее надо начать поиск со второй строки аналогичным способом т.е. искомый элемент с которого мы начинаем искать в N это 2,2=-1 и все больше нет ненулевых элементов по этому ответ будет С(11,2)=-1 далее смотрим 3 строку начинаем с элемента 3,3 ответом будет С(10,3)=0 для 4 строки ответ С(9,4)=0 далее С(6,5)=0 и с7,6=1 и все на этом вся задача больше ничего не надо будет. Я вас наверно уже замучила), простите но я без Вас никак.
Доброго времени суток!

Наконец-таки добрался до интернета. Ох, сколько Вы тут неправды про меня написали! Спасибо, спасибо, польщен.
Если проблема все еще актуальна, задам несколько вопросов и пожеланий:

1)как Вам необходимо осуществить ввод вектора, назовем его T (в Вашем примере T=[5 11 10 9 6 7]): просто в виде массива, который Вы сможете поменять непосредственно в программе; или через диалоговое окно ввода?

2)в Вашем примере узлов у ломанной 7( (1,1),(6,1),(6,6),(5,6),(5,5),(2,5),(2,2 )), а вектор длиной только 6 (5,11,10,9,6,7). Длины вектора для всей цепочки не хватает, возникает такой вопрос критично сначала нули ставить? Или их можно добавить в конце (после того, как вектор T кончится)?

3)и, главное, чтобы не устраивать наводнение из постов, содержащих пояснения, исправления и уточнения, и ускорить выполнение программы. Давайте для Вашей конкретной матрицы:

N =
[1 0 0 0 0 0
0 -1 0 0 1 0
0 0 -1 0 0 0
0 0 0 -1 0 0
0 0 0 0 -1 1
-1 0 0 0 0 -1]

и Вашего вектора

T=[5 11 10 9 6 7]

Вы выпишите по шагам полное решение. Потом хорошенько его проверьте (или попросите кого-нибудь проверить) и только потом поместите сообщение сюда, потому что из обилия Ваших уточняющих и исправляющих сообщений - трудно понять, что конкретно Вам нужно.

С уважением, помогающий =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.08.2012, 17:41
Помогаю со студенческими работами здесь

Как не учитывать строковые переменные (string) в матрице, вывести минимальные значения по строкам и столбцам?
как не учитывать строковые переменные (string) в матрице, вывести минимальные значения по строкам и столбцам??? N- может быть в любом...

Найти минимальное из максимальных элементов и максимальное из минимальных элементов по строкам и по столбцам
Сформировать целочисленную матрицу из величин типа integer. Найти минимальное из максимальных элементов и максимальное из минимальных...

Определение индексов максимальных элементов по строкам и столбцам
Всем Доброго времени суток! Заранее прошу прощение, если где-то уже подобная тема была поднята. Есть матрица, в которой требуется...

Двумерный массив, посчитать сумму элементов по строкам, столбцам и диагоналям
двумерный массив, посчитать сумму элементов по строкам, столбцам и диагоналям

Чем отличается просмотр элементов матрицы по столбцам от просмотра по строкам?
Чем отличается просмотр элементов матрицы по столбцам от просмотра по строкам? Каковы особенности обработки матрицы?Можно ли просмотреть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru