Writing text files (writetable, fprintf) in MATLAB - Time & Space Complexity
When writing data to text files in MATLAB, it's important to know how the time needed grows as the data size grows.
We want to understand how the time to save data changes when we have more rows or more data to write.
Analyze the time complexity of the following code snippet.
% Write table data to a text file
T = table((1:1000)', rand(1000,1), 'VariableNames', {'ID', 'Value'});
writetable(T, 'output.txt');
% Write formatted data line by line
fid = fopen('output2.txt', 'w');
for i = 1:height(T)
fprintf(fid, '%d %.4f\n', T.ID(i), T.Value(i));
end
fclose(fid);
This code writes a table of 1000 rows to text files using two methods: writetable and fprintf in a loop.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Writing each row of data to the file.
- How many times: Once for each row in the table (1000 times in this example).
As the number of rows increases, the time to write grows roughly in direct proportion.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 write operations |
| 100 | 100 write operations |
| 1000 | 1000 write operations |
Pattern observation: Doubling the number of rows roughly doubles the time to write.
Time Complexity: O(n)
This means the time to write grows linearly with the number of rows in the data.
[X] Wrong: "Writing a few extra columns or formatting details does not affect time much."
[OK] Correct: Each extra column means more data to write per row, so the time per row increases, making the total time grow more than expected.
Understanding how file writing time grows helps you explain performance in real projects where saving large data is common.
"What if we changed the loop with fprintf to write multiple rows at once? How would the time complexity change?"
Practice
Solution
Step 1: Understand the purpose of
writetablewritetableis designed to save MATLAB tables directly to files like CSV with minimal code.Step 2: Compare with other functions
fprintfis for custom text formatting,fopenopens files but doesn't save tables, andloadis for loading data, not saving.Final Answer:
writetable -> Option AQuick Check:
Save table fast = writetable [OK]
- Confusing fprintf with writetable for saving tables
- Using fopen alone to save data
- Thinking load saves files
Solution
Step 1: Understand fopen modes
'r' is read-only, 'w' is write (creates or overwrites), 'a' appends, 'x' creates new file but errors if exists.Step 2: Choose mode for writing
To write fresh data, use 'w' mode to open file for writing.Final Answer:
fid = fopen('data.txt', 'w'); -> Option AQuick Check:
Open file for writing = 'w' mode [OK]
- Using 'r' mode which is read-only
- Using 'a' when overwrite is needed
- Confusing 'x' mode with 'w'
fid = fopen('output.txt', 'w');
fprintf(fid, 'Value: %d\n', 42);
fclose(fid);Solution
Step 1: Analyze fprintf formatting
fprintfwrites formatted text. '%d' is replaced by integer 42, '\n' adds a newline.Step 2: Check file closing
fclose(fid)properly closes the file, so no error occurs.Final Answer:
Value: 42 -> Option BQuick Check:
Formatted integer output = Value: 42 [OK]
- Forgetting to close the file
- Expecting %d to appear literally
- Confusing output with just the number
fid = fopen('numbers.txt', 'w');
fprintf(fid, '%d\n', 1:5);
% Missing fclose(fid)Solution
Step 1: Check file opening
fopenuses 'w' mode correctly, so file opens for writing.Step 2: Check file closing
The code does not callfclose(fid), which is necessary to save and release the file.Final Answer:
Missing fclose to close the file -> Option DQuick Check:
Always fclose after writing [OK]
- Forgetting fclose causes incomplete writes
- Thinking fprintf needs different format for vectors
- Assuming fopen mode is missing
T with columns 'Name' and 'Score' to a CSV file, but only include rows where Score > 50. Which MATLAB code correctly does this?Solution
Step 1: Filter rows where Score > 50
Use logical indexing:T.Score > 50selects rows with Score greater than 50.Step 2: Use writetable to save filtered table
Pass filtered rowsT(T.Score > 50, :)towritetableto save only those rows.Final Answer:
writetable(T(T.Score > 50, :), 'filtered.csv'); -> Option CQuick Check:
Filter rows then writetable = writetable(T(T.Score > 50, :), 'filtered.csv'); [OK]
- Using fprintf without opening file
- Not filtering rows before saving
- Saving entire table without filtering
Ready to prove it?
Pass the test and this pattern moves unknown
