2014-10-14 2 views
1

Предположим, у меня есть много исходных файлов, я хочу организовать их в структуре папок-деревьев.Организация исходного дерева в MATLAB (#include)

Возможно ли, чтобы у меня было несколько файлов с одинаковым именем и использовать каждый из них из места, в котором я нуждаюсь, или у меня должны быть все функции и классы с разными именами?

В C++ у меня есть #include, чтобы ввести функции, которые мне нужны, вот здесь?

Просто для иллюстрации:

.\main.m 
.\Algorithms\QR\Factory.m % function Factory 
.\Algorithms\QR\Algorithm.m % function Algorithm 
.\Algorithms\SVD\Factory.m % function Factory 
.\Algorithms\SVD\Algorithm.m % function Algorithm 
+1

Этот вопрос может помочь: http://stackoverflow.com/questions/1277613/how-do-emulate-include-behaviour-in-matlab, но похоже, что Mathworks удалила документы для этого:/ – Dan

+1

You может немного задать этот вопрос. Проблема в том, что вы хотите написать несколько функций в одном файле и использовать их отдельно? Или вы хотите создать несколько файлов с одинаковыми именами и каждый файл, содержащий одну функцию? Или, может быть, смесь. Или вы хотите дать много файлов одинакового имени и позволить им содержать функции с разными именами? – patrik

+0

Итак, тогда вы хотите сделать что-то похожее на то, что в C++ будет '#include 'Алгоритмы \ QR \ Factory.m" ... #include "\ Algorithms \ SVD \ Factroy.m" '? – patrik

ответ

4

MATLAB поддерживает namespaces. Таким образом, в вашем примере вы можете создать следующее:

C:\some\path\main.m 
C:\some\path\+algorithms\+qr\factor.m 
C:\some\path\+algorithms\+svd\factor.m 

(Примечание: только родительская папка пакет, папка верхнего уровня должна быть на пути MATLAB, то есть: addpath('C:\some\path'))

Тогда вы могли бы вызвать каждый из которых имеет полное имя:

>> y = algorithms.qr.factor(x) 

>> y = algorithms.svd.factor(x) 

Вы также можете импортировать пакет в какой-либо сфере. Например:

function y = main(x) 
    import algorithms.svd.*; 
    y = factor(x) 
end 
+0

Возможно, вы захотите добавить, что это не совсем то же самое, что он пишет в примере, поскольку функция matlab не является одним и тем же заголовком. Заголовок содержит определения функций, и если два разных заголовка используют одно и то же пространство имен (или являются глобальными), тогда у вас также будет конфликт в c/C++. В противном случае, действительно хороший ответ. Я совершенно не знал об этом. – patrik

+0

это похоже на [namespaces] (https://en.wikipedia.org/wiki/Namespace) в [C++] (http://www.tutorialspoint.com/cplusplus/cpp_namespaces.htm) или пакеты на Java. Это всего лишь способ организовать связанные функции и классы и избежать столкновений имен. Очевидно, что в MATLAB нет '# include', ближайшая вещь -' addpath' (хотя у нее есть свой собственный набор правил для определения [приоритета] (http://www.mathworks.com/help/matlab/matlab_prog/function-precedence-order.html)) – Amro

+0

После того, как я переместил файлы в SDK/Алгоритмы, он не может найти их с командой 'SDK.Algorithms.QR .Modified (А) '. Я получил * Неопределенная переменная «SDK» или класс «SDK.Algorithms.QR.Modified». * – Yola

1

Чтобы понять эту проблему, мне нужно, чтобы объяснить некоторые различия между отношением C++ исходных файлов и файлов заголовка и .m файлов.

Во-первых: В Matlab вы можете запускать только функцию, которая определяется наивысшим образом в файле .m. Этот файл определяет вершину иерархии. Тогда подфункции могут быть реализованы в том же файле m, но они могут использоваться только внутри одного файла .m.

Во-вторых: В дополнение к этому, Matlab проверил путь включения для определенного имени файла и предположил, что функция внутри файла будет иметь то же имя. Вы заметите это с помощью предупреждения, если вы определите функцию с другим именем, кроме имени файла. Дело в том, что у вас не может быть двух функций matlab с тем же именем, если все функции глобальны. Это было бы так же, как если бы у вас было бы 2 функции с тем же именем и в том же пространстве имен в C++.

Примечание: Путь включения в matlab обычно может выполняться с жестко закодированным файлом в папке вашей программы. Эта функция использует функцию matlab addpath.

Это принципиальное отличие от c/C++, когда в одном исходном файле разрешено определять несколько функций. Затем заголовочный файл выбирает исходный код, который вы реализуете в программе, предоставляя определения функций. Важно то, что заголовок полностью отключен от имен функций, которых они не в matlab. Это означает, что аналогия в ваших примерах не совсем точна. Предложенная вами вещь состоит в том, чтобы «включить» 2 функции с тем же именем. Это невозможно, либо c/C++ (предполагая, что функции используют одно и то же пространство имен или ar global), либо в matlab.

Пример: Если заголовки topFolder/foo/bar.h и topFolder/baz/bar.h будут содержать функцию void myDup(int a), и оба заголовка используют одно и то же пространство имен (или являются глобальными), то это приведет к возникновению ошибки.

Однако, если функции используются только ограниченным числом других функций, то функция, например. Завод.м, могут быть включены как частные функции в разные папки. Это также означает, что только эта папка может получить к ней доступ. Также возможно использовать пространство имен matlab, как указано в Amro's answer.

Смежные вопросы