select selected numeber of rows from an huge array

1 次查看(过去 30 天)
Hi,
I need to select 365 (366,:) rows from array of [3652500 x 2] and write a matrix [366 x 10000]. Can somebody help me with that. I am new to MATLAB.
Thanks in advance.
  5 个评论
dpb
dpb 2014-5-12
编辑:dpb 2014-5-12
>> (3652500*2)==(366*10000)
ans =
0
>> num2str((3652500*2)/366,'%.5f')
ans =
19959.01639
>>
Don't fit.
doc reshape % but will have to be commensurate sizes
Walter Roberson
Walter Roberson 2014-5-12
Your first dimension is being reduced by a factor of about 10000, but your second dimension is being increased by a factor of 5000 (10000 / 2). Where is the remaining data to go?

请先登录,再进行评论。

采纳的回答

per isakson
per isakson 2014-5-12
编辑:per isakson 2014-5-14
There are a couple of magic numbers in your question. I guess it is the number of days in a year. "366" is leap year.
>> M = cssm;
>> whos M
returns
Name Size Bytes Class Attributes
M 366x10000 29280000 double
where
function M02 = cssm
N01 = 3652500;
N02 = 1e4;
M01 = randi( [1,17], [N01,2] );
M02 = nan( 366, N02 );
x01 = 1;
for jj = 1 : N02
if rem( jj, 4 ) >= 1
x02 = x01 + 365 - 1;
M02(1:365,jj) = M01( x01:x02, 1 );
x01 = x02+1;
else % leap year
x02 = x01 + 366 - 1;
M02(1:366,jj) = M01( x01:x02, 1 );
x01 = x02+1;
end
end
end
.
Comment: I chose to build the new array from the first column of your array. You can easily modify the code to use the second column or both.
.
Answer to comment:
I downloaded 0001.txt, but I still lack information
  • What is the first column of whole numbers? It is not time information.
  • Which of the first and second column shall be included in the result?
  • There is no way to decide which data belongs to leap years.
Try
M02 = cssm;
whos M02
which returns
Name Size Bytes Class Attributes
M02 366x10000 29280000 double
where
function M02 = cssm( varargin )
narginchk( 0, 1 )
if nargin == 1
filespec = varargin{1};
else
filespec = 'h:\m\cssm\0001.txt';
end
fid = fopen( filespec, 'r' );
cac = textscan( fid, '%f%*f%*f%f' );
fclose( fid );
M01 = cat( 2, cac{:} );
M02 = cssm_( M01 );
end
function M02 = cssm_( M01 )
N02 = 1e4;
M02 = nan( 366, N02 );
x01 = 1;
for jj = 1 : N02
if rem( jj, 4 ) >= 1
x02 = x01 + 365 - 1;
M02(1:365,jj) = M01( x01:x02, 2 );
x01 = x02+1;
else % "leap" year
x02 = x01 + 366 - 1;
M02(1:366,jj) = M01( x01:x02, 2 );
x01 = x02+1;
end
end
end
  6 个评论
per isakson
per isakson 2014-5-14
@Damith, I added to the answer above. Use the debugging tools to analyze the behavior of the new function, cssm
Here are some links on debugging in Matlab
Damith
Damith 2014-5-16
@ per isason,
Thanks. I figuerd it out using ur code. Many thanks again.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by