Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604

Функция Matlab

15.11.2012, 14:23. Показов 2661. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаю функцию, которая выполняет данный алгоритм: даны 3 одномерных массива A,B,C с одинаковым числом элементов. Составить новый массив D, в котором бы чередовались числа из этих 3х массивов, т.е. D(1)=A(1), D(2)=B(1), D(3)=C(1), D(4)=A(2) и т.д.
вот код
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function D=funct(A,B,C) 
 l=length(A);
 p=length(B);
if l~=p
     text(0.3, 0.7, 'Error')
     elseif size(A)~=size(C)
     text(0.3, 0.7, 'Error')
end
D=[];
k=size(A);
m=k(2);
for i=1:m
 D=[ D A(i) B(i) C(i)];
end
disp(['D= ',num2str(D)]);
Но выдается ошибка,в строке l=length(A), т.к. не задан массив A, но его должен вводить пользователь в ходе самой программы..Вот я и не знаю, как так сделать, чтобы функция считывала из самой программы массивы..Или как-то по-другому это всё сделать?
И ещё - как в случае, если массивы не одного размера, сразу после вывода сообщения об ошибке (в условии if) прекратить дальнейшее выполнение функции?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2012, 14:23
Ответы с готовыми решениями:

Функция hardlim в Matlab
Помогите! Есть примеры %1) n=-5:0.1:5; a=hardlim(n); da=dhardlim(n); plot(n,a,'r') % – график функции активации – красный; ...

Matlab и дельта-функция
Здравствуйте! У меня есть такой вопрос. Не знаю, возможно, он глупый, потому что я больше физик и с матлабом немного на "вы".....

Файл-функция Matlab
Стоит задача: Вычислить произведение элементов вектора, не превосходящих среднее арифметическое значение его элементов. Использовать...

4
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
15.11.2012, 14:42
Но выдается ошибка,в строке l=length(A), т.к. не задан массив A, но его должен вводить пользователь в ходе самой программы..Вот я и не знаю, как так сделать, чтобы функция считывала из самой программы массивы..Или как-то по-другому это всё сделать?
Это файл-функция: его запускать не надо! Его нужно обозвать, так же как и саму функцию funct.m и сохранить в одном каталоге с программой использующей ее! Тогда уже можно набросать файл-программу и в нем использовать эту функцию!

И ещё - как в случае, если массивы не одного размера, сразу после вывода сообщения об ошибке (в условии if) прекратить дальнейшее выполнение функции?
С помошью директивы return:
Matlab M
1
2
3
4
5
6
7
8
9
10
function D=funct(A,B,C) 
l=length(A);
p=length(B);
if l~=p
    text(0.3, 0.7, 'Error')
    return
elseif size(A)~=size(C)
    text(0.3, 0.7, 'Error')
    return
end
Кликните здесь для просмотра всего текста
Кстать, еще можно сделать так:
Matlab M
1
2
3
4
5
6
D = [];
n = length(A);
D(1:3:3*n) = A;
D(2:3:3*n) = B;
D(3:3:3*n) = C;
disp(['D= ',num2str(D)]);
И еще наверно полмиллиона способов есть, поэтому я не настаиваю, ваш вариант рабочий
1
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
15.11.2012, 20:01  [ТС]
Спасибо сейчас попробую

Добавлено через 5 часов 9 минут
Вот, что написал :
код функции:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function D=bogerfunct(A,B,C) 
 l=length(A);
 p=length(B);
if l~=p
     text(0.3, 0.7, 'Error')
     return
     elseif size(A)~=size(C)
     text(0.3, 0.7, 'Error')
     return
end
D=[];
k=size(A);
m=k(2);
for i=1:m
 D=[ D A(i) B(i) C(i)];
end
disp(['D= ',num2str(D)]);
Назвал её bogerfunct.m
В той же папке создал новый файл, вот код:
Matlab M
1
2
3
4
A=1:1:7;
B=8:1:14;
C=15:1:20;
bogerfunct(A,B,C);
В C специально написал до 20, чтобы появилось сообщение об ошибке (по оператору If в функции), но в Command Window появилось сообщение об ошибке
Code
1
2
3
4
5
6
7
??? Attempted to access C(7); index out of bounds because numel(C)=6.
 
Error in ==> bogerfunct at 15
 D=[ D A(i) B(i) C(i)];
 
Error in ==> example at 4
bogerfunct(A,B,C);
а текста никакого не появилось вот и не знаю, что не так теперь
0
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
16.11.2012, 12:13
Там похоже была заморочка с elseif size(A)~=size(C)
Я это все дело чуток подправил:
Функция bogerfunct.m:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function D = bogerfunct(A,B,C)
l = length(A);
p = length(B);
k = length(C);
D=[];
 
if l~=p
    text(0.3, 0.7, 'Error')
    return
elseif l~=k
    text(0.3, 0.7, 'Error')
    return
end
 
for i=1:k
    D=[ D A(i) B(i) C(i)];
end
Здесь я сначала просчитал все три длинны l, p, k, затем идет объявление D, чтобы в результате ошибки возвращалось пустое значение и программа не останавливалась, потом проверки и сам расчет. Перенес строку disp(...) из функции в программу, чтобы оно не выводилось при каждом обращении.
Единственное, сообщение об ошибке отображается в графическом окне figure, т.к. ф-ция text(0.3, 0.7, 'Error') предназначена для работы с графикой. Не знаю, так задумано или нет, но в текстовом варианте можно использовать ф-цию:
error('Длины векторов не равны!')

Это все, что я подправил в функции, а вот программа:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
clear
clc
 
% сдесь выдает ошибку
A=1:7;
B=8:1:14;
C=15:1:20;
D = bogerfunct(A,B,C);
disp(['D= ',num2str(D)]);
 
% а здесь считает верно
A = 1:5;
B = A*0;
C = B + 8;
D = bogerfunct(A,B,C);
disp(['D= ',num2str(D)]);
В этом варианте все работает как надо.
1
536 / 523 / 38
Регистрация: 13.03.2011
Сообщений: 728
16.11.2012, 12:19
Вот такой вариант. Если убрать проверки, то будет еще короче. Всё записывается в одном файле (funct.m)
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
function D = funct(A,B,C)
D = [];
N = length(A);
K = length(B);
M = length(C);
if( ~isvector(A) || ~isvector(B) || ~isvector(C))
   disp('Один из массивов не является одномерным!'); % можно применить функцию error
   return;
end
if( N ~= K || N ~= M)
   disp('Массивы имеют разную длину!'); % можно применить функцию error
   return;
end
A = setRow(A);
B = setRow(B);
C = setRow(C);
D = [A; B; C];
D = D(:)';
 
 
function y = setRow(x)
y = x;
if ~isrow(y)
   y = y';
end
Добавлено через 4 минуты
Цитата Сообщение от Зосима Посмотреть сообщение
В этом варианте все работает как надо.
А если A, B или C матрицы с одинаковым числом столбцов или строк? :-)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2012, 12:19
Помогаю со студенческими работами здесь

Неопределенная функция Matlab
Добрый вечер! Очень нужна Ваша помощь в поиске ошибки. Есть функция (функцию не запускала, просто сохранила, как описывается в теме...

m-функция matlab как создать?
Для формирования обучающей и тестовой выборок для нейронной сети используются следующие пользовательские функции: oprt, vxod, oprvx. ...

Встроенная функция дифференцирования (diff) Matlab
Возник вопрос ,как после применения функции дифференцирования , файл - функция возвращал результат вычисления, а не символьное выражение? ...

Есть ли функция в Matlab, аналогичная функции ПРОЦЕНТРАНГ в Excel
Коллеги интересует функция в Matlab аналогичная функции Excel ПРОЦЕНТРАНГ? Может можно как-то выполнить тот же расчет используя другие...

Как можно нарисовать график функция сердца на MatLab
Добрый день! Помогите пожалуйста как можно нарисовать, гарфик такой функция на MatLab \huge x^2+(y-\sqrt{|x|} )^2=1


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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 На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru