powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как транспонировать матрицу ?
13 сообщений из 13, страница 1 из 1
Как транспонировать матрицу ?
    #38744139
Vipera_lebetina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, господа. Подскажите, пожалуйста, начинающим лисоводам как можно решить следующую задачу?

Во входном файле задана матрица целых чисел в виде строк. Элементы строки матрицы разделяются запятыми. В строках находятся только элементы матрицы и разделители. Элементы матрицы не содержат лидирующих нулей.
Максимальный размер матрицы 1000 х 1000.
Количество цифр в элементах матрицы ≤ 500.
В выходном файле получите транспонированную матрицу в виде строк.Чтобы элементы строки матрицы разделялись запятыми.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744148
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитать исходный файл в массив, транспонировать во второй массив, записать второй массив в выходной файл.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744153
Vipera_lebetina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, мы не знаем как транспонирование само делать((((
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744154
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглить пробовали?
Например в википедии почитать
... для получения транспонированной матрицы из исходной нужно каждую строчку исходной матрицы записать в виде столбца в том же порядке.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744176
Vipera_lebetina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, именно в фокспро как делается - есть какие-то специальные функции или тупо перестановку надо как-то организовать.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744187
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет специальных функций, фокспро не эксель, не заточен на работу с матрицами.
Тупо перестановку в цикле.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744201
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь залить в курсор с полями: Столбец, Строка, Значение. Отсортировать по полям Строка,Столбец. SCANом вывод значений в конечный файл.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744212
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напутал немного:
Залить в курсор с полями: Столбец, Строка, Значение. Отсортировать по полям Столбец, Строка . SCANом вывод значений в конечный файл с переходом на новую строку при изменении в поле Столбец.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744255
Vipera_lebetina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, продумываем алгоритм и возник такой вопрос сопутствующий : как в 6й версии FoxPro из Memo копировать данные в массив? Функция ALINES( ) не подходит по версии.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744269
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В мемо поле что именно записано? Весь исходный файл или одна строка?

В 6-ке массив может содержать максимум 65000 элементов, поэтому массив 1000 х 1000 не создастся.
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38744306
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С помощью ALINES() разбить на строки, а строки распарсить
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
lcLine = '11,22,33,44' && строка для разбора
j = 0
lnPosPrev = 0
lnPos = 1
do while lnPos != 0
	j = j + 1
	lnPos = at(',', lcLine, j)
	if lnPos = 0
		lcValue = substr(lcLine, lnPosPrev + 1)
	else
		lcValue = substr(lcLine, lnPosPrev + 1, lnPos - lnPosPrev - 1)
	endif
	lnPosPrev = lnPos 
	? j, lcValue
enddo
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38768462
FAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vipera_lebetina,
Вот примерчик :

PROCEDURE TranspMat
* Транспонирование матрицы
* матрица:
***
* 1 2 3 4
* 5 6 7 8
* 9 10 11 12
* 13 14 15 16
*SET STEP ON
*Создаем курсор
CREATE CURSOR m1 (p1 n(2,0),p2 n(2,0),p3 n(2,0),p4 n(2,0))
* заносим в него данные
INSERT INTO m1 values(1,2,3,4)
INSERT INTO m1 values(5,6,7,8)
INSERT INTO m1 values(9,10,11,12)
INSERT INTO m1 values(13,14,15,16)
* смотрим результат
SELECT m1
BROWSE TITLE 'Исходная матрица '
** Создаем курсор для транспонирования
CREATE CURSOR t1 (p1 n(2,0),p2 n(2,0),p3 n(2,0),p4 n(2,0))
* Транспонируем
FOR ii=1 TO 4

FieldMatr = 'm1.P'+ALLTRIM(STR(ii)) && Поле, из которого берем

SELECT t1
APPEND BLANK

SELECT m1
it =1
SCAN
NameField = 'P'+ALLTRIM(STR(it)) && Поле, в которое втавляем
replace &NameField WITH &FieldMatr IN t1
it = it+1
ENDSCAN

ENDFOR
* смотрим результат - матрица повернута
SELECT t1
BROWSE TITLE 'Транспонированная матрица '

* Транспонируем еще раз, чтобы показать,
* что дважды транспонированнная матрица принимает исходное состояние

USE IN m1 && Закрываем исходную матрицу и создаем пустую исходную
CREATE CURSOR m1 (p1 n(2,0),p2 n(2,0),p3 n(2,0),p4 n(2,0))


FOR ii=1 TO 4

FieldMatr = 't1.P'+ALLTRIM(STR(ii)) && Поле, из которого берем

SELECT m1
APPEND BLANK

SELECT t1
it =1
SCAN
NameField = 'P'+ALLTRIM(STR(it)) && Поле, в которое втавляем
replace &NameField WITH &FieldMatr IN m1
it = it+1
ENDSCAN

ENDFOR

* смотрим результат - матрица повернута
SELECT m1
BROWSE TITLE 'Дважды транспонированная матрица '
...
Рейтинг: 0 / 0
Как транспонировать матрицу ?
    #38768533
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vipera_lebetina, если в VFP 6 надо транспонировать матрицы 1000x1000, единственный вариант разместить данные для прямого доступа - это создать текстовый массив. Команда DIMENSION допускает квадратную матрицу не более, чем 254x254, число столбцов в таблице не может быть более 255. Так что придётся работать примерно таким манером:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SET TALK OFF && Для разгона примера
SET SAFETY OFF
CLOSE ALL
CLEAR
CLEAR ALL
#DEFINE NUM_LEN 19 && Длина одного числа в текстовом формате
LOCAL m.Hnd_ln, m.S_lc, m.M_ln, m.N_ln, m.I_ln, m.J_ln, m.K_ln, m.Line_ln
STORE 1000 TO m.M_ln, m.N_ln && Размерность матрицы 1000x1000
m.Line_ln = NUM_LEN * m.N_ln && Длина строки матрицы
* Строим файловый массив для исходной матрицы Mстрок х Nстолбцов
m.S_lc = REPLICATE ('0', m.LineLen_ln)
m.Hnd_ln = FCREATE ('M1.txt')
FOR m.I_ln = 1 TO m.M_ln
  =FWRITE (m.Hnd_ln, m.S_lc)
ENDFOR
* Выбираем значение из ячейки I, J
m.I_ln = 101 && строка
m.J_ln = 201 && колонка
m.k_ln = FSEEK (m.Hnd_ln, (m.I_ln-1) * m.LineLen_ln + (m.J_ln-1) * NUM_LEN, 0)
m.S_lc = FREAD (m.Hnd_ln, NUM_LEN)
=FCLOSE (m.Hnd_ln)
 [code=plaintext]
                    
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как транспонировать матрицу ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]