2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как вернуть два массива из метода C#
Сообщение23.08.2011, 00:56 


17/04/06
256
День добрый,

Я хотел бы написать метод отыскания собственных значений и векторов симметричной действительной матрицы. Получается, что метод должен возвращать две матрицы. Я что-то никак не могу сообразить как это сделать. Можно конечно передать через out или через поля объекта, но мне кажется, что можно еще через tuples. Как кстати будет по русски tuples и подходят ли они для этой задачи?

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 03:33 


17/04/06
256
Еще одно замечание. Я планирую использовать метод Якоби для отыскания собственных значений. Этот метод, мне кажется, можно запрограммировать используя рекурсию, так что если вернуть два массива, то было бы очень все просто.

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 04:28 
Заслуженный участник


26/07/09
1559
Алматы
Tuples -- кортежи. Пример для пары целых чисел: Tuple<int, int> f() {return new Tuple<int, int>(3, 5);}. Для пары массивов -- аналогично.

P.S.: Не думаю, что это стоит использовать с рекурсией да ещё и в серьезном проекте. :)

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 19:28 


17/04/06
256
Большое спасибо!

Интересно, почему вы не рекоммендуете кортежи в серьезных программах?

Похоже кортежи относительно новая конструкция. (в Троелсен мне найти не удалось)

p.s. почему нет проверки орфографии на форуме?

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 20:40 
Заслуженный участник


27/04/09
28128
Bridgeport в сообщении #477234 писал(а):
p.s. почему нет проверки орфографии на форуме?
Это такой особенный способ рейтинга. :-)

Я тоже думаю, что для смысла нужнее использовать out-параметры. Пока ещё пользователь будет извлекать из вашего кортежа матрицы, а тут р-раз! и всё. Рекурсию тоже не советую. Ударит по скорости создание новых и новых матриц (и кортежей, содержащих их) для каждого возврата из функции.

-- Вт авг 23, 2011 23:44:33 --

Bridgeport в сообщении #477234 писал(а):
Интересно, почему вы не рекоммендуете кортежи в серьезных программах?
Да почему же, есть место и им (наверно — пока не придумал — надо знать, чем они отличаются от списков и массивов). Но не здесь.

-- Вт авг 23, 2011 23:53:52 --

А, я дурак. Tuple<...> нужны для описания сложных generic'ов!

-- Вт авг 23, 2011 23:54:10 --

И где-нибудь около.

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 22:51 
Заслуженный участник


09/08/09
3438
С.Петербург
Bridgeport в сообщении #477234 писал(а):
Интересно, почему вы не рекоммендуете кортежи в серьезных программах?
Да нет никаких противопоказаний, пользуйтесь на здоровье. В документации написано буквально следующее:
MSDN в статье писал(а):
    Tuples are commonly used in four ways:
  • To represent a single set of data. For example, a tuple can represent a database record, and its components can represent individual fields of the record.
  • To provide easy access to, and manipulation of, a data set.
  • To return multiple values from a method without using out parameters (in C#) or ByRef parameters (in Visual Basic).
  • To pass multiple values to a method through a single parameter. For example, the Thread.Start(Object) method has a single parameter that lets you supply one value to the method that the thread executes at startup time. If you supply a Tuple<T1, T2, T3> object as the method argument, you can supply the thread’s startup routine with three items of data.
Только, на мой взгляд, для возврата нескольких значений из метода удобнее описать структуру (struct): по крайней мере, не придется потом мучительно вспоминать, какое значение в каком элементе кортежа Вы возвращаете.

Также не вижу причин не использовать кортежи в качестве возвращаемого значения в рекурсивных методах.

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 23:17 
Заслуженный участник


27/04/09
28128
А как же производительность?

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 23:44 
Заслуженный участник


09/08/09
3438
С.Петербург
arseniiv в сообщении #477287 писал(а):
А как же производительность?
А в чем конкретно Вы видите потерю производительности?

Не думаю, что в каких-то реальных приложениях экономия времени за счет способа возврата результатов работы метода может оказаться существенной.

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 23:50 
Заслуженный участник


27/04/09
28128
Я больше про рекурсию. Если она будет глубокой, то будет создаваться много промежуточных матриц. Притом, если метод будет вызываться часто, сборщик мусора может немного не успевать (наверно) за всё новыми и новыми оставленными матрицами, а если они большого размера… то будет медленнее за счёт загрузки/сброса страниц памяти с/на диск.

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.08.2011, 23:56 
Заслуженный участник


09/08/09
3438
С.Петербург
arseniiv в сообщении #477294 писал(а):
Я больше про рекурсию.
Тут Вы, конечно, правы: если рекурсивное решение предполагает копирование большого количества матриц, а итеративное позволяет обойтись одной копией, то последнее будет более эффективным. На саму же рекурсию накладные расходы минимальны.

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение24.08.2011, 00:25 


17/04/06
256
Интересные наблюдения!

Еще в кортежах нельзя менять поля, так что придется использовать struct.

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение10.09.2011, 18:16 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Вы можете использовать KeyValuePair<T1 key, T2 value>. Хотя тут тоже поля key и value менять нельзя. Но такое ограничение легко обойти следующим образом:

Код:
public class GenContainer<T>
{
    public T inner;
}


Сигнатура функции, возвращающей 2 массива будет выглядеть примерно так:
Код:
public KeyValuePair<GenContainer<double[]>, GenContainer<double[]>> getTwoArrays()
{
}


При этом сами поля key и value менять будет нельзя, но поле inner, находящееся внутри них, менять будет можно:

Код:
KeyValuePair<GenContainer<double[]>, GenContainer<double[]>>  res = getTwoArrays();
res.key.inner= new double [N];
res.value.inner= new double [N];

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение22.09.2011, 21:39 


17/05/11
158
Есть ещё один хитрый способ: объявить массив в глобальной области. дальше додумывайте сами :-)

 Профиль  
                  
 
 Re: Как вернуть два массива из метода C#
Сообщение23.09.2011, 20:07 
Заслуженный участник


27/04/09
28128
Это не хитрый, а неправильный в общем случае способ.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group